私はユーザーのコレクションを持っています:
db.users.find()
{ "_id" : ObjectId("56d9f3435ce78127510332ea"), "index" : 1, "isActive" : false, "name" : "Noble", "surname" : "Downs", "email" : "nobledowns@conferia.com", "phone" : "+1 (812) 412-3775", "address" : "357 River Street, Chelsea, District Of Columbia, 5938" }
{ "_id" : ObjectId("56d9f3435ce78127510332eb"), "index" : 0, "isActive" : false, "name" : "Moore", "surname" : "Vinson", "email" : "moorevinson@conferia.com", "phone" : "+1 (902) 511-2314", "address" : "433 Sullivan Street, Twilight, Maine, 4931" }
{ "_id" : ObjectId("56d9f3435ce78127510332ec"), "index" : 4, "isActive" : false, "name" : "Madge", "surname" : "Garza", "email" : "madgegarza@conferia.com", "phone" : "+1 (828) 425-3938", "address" : "256 Bowery Street, Chesapeake, Wyoming, 1688" }
{ "_id" : "56bc57c4ea0ba50642eb0418", "index" : 10, "isActive" : true, "name" : "Maritza", "surname" : "Foster", "email" : "maritzafoster@conferia.com", "phone" : "+1 (884) 416-2351", "address" : "556 Conway Street, Ernstville, Pennsylvania, 134" }
私のテストのためだけに、最後のものには Object_id がないことに注意してください。私はKoa2を使用し、async /awaitを使用していますが、影響はないと思います。私のルートは/api/usersにマウントされており、次のようになっています。
import User from '../models/user'
var router = require('koa-router')();
var ObjectId = require('mongoose').Types.ObjectId;
router
.get('/', async ctx => ctx.body = await User.find({}))
.get('/:id',
async (ctx) => {
try {
let id = ObjectId(ctx.params.id);
const user = await User.findById(id)
if (!user) {
ctx.throw(404)
}
ctx.body = user
} catch (err) {
if (err === 404 || err.name === 'CastError') {
ctx.throw(404)
}
ctx.throw(500)
}
})
http://localhost:3000/api/usersをロードすると、すべてのユーザーが表示されます。
http://localhost:3000/api/users/56d9f3435ce78127510332eaを読み込むと、そのユーザーのみが表示されます。
ただし.... http://localhost:3000/api/users/56bc57c4ea0ba50642eb0418をロードすると、内部サーバーエラーが発生しました。
http://localhost:3000/api/users/whateverを読み込むと、Internal Server Error も表示されます
だから私の質問: findById は常に Object_id を期待していますか? この Object_id がコレクションに含まれていない場合、404 を返すべきではありませんか?
自分の ID でデータをインポートするとどうなりますか? findById メソッドを使用できませんか? この行にコメントしたとしても?let id = ObjectId(ctx.params.id);
404 エラーが発生することはありませんか?
ctx.body = err の ctx.throw (500) を変更すると、常にブラウザに {} が表示されます。たぶんそれが理由です、エラーは空です。しかし、なぜ?