express.js mongoose: запасной вариант при неправильном идентификаторе?

#javascript #mongodb #node.js #express #mongoose

#javascript #mongodb #node.js #выразить #mongoose

Вопрос:

я использую express.js с помощью mongoose для доступа к MongoDB. я пытаюсь реализовать запасной вариант, если кто-то вводит URL, который не существует (на основе идентификатора пользователя). вот код:

 app.get('/track/:id', function(req, res) {
var user_id = req.params.id;
User.findById(user_id, function(err, user_) {
    if (!err) {
        res.render('track', { pins: user_.pins, layout: false });
    } else {
        res.send("FAIL! "   err);
    }
});
});
  

при доступе http://foo.bar/track/1234 и 1234 не существует, он должен напечатать СБОЙ!, если идентификатор существует, он должен получить его содержимое из базы данных (это действительно работает). это то, что я получаю сейчас при вводе неправильного идентификатора (приложение вылетает):

 /home/node/node-service/releases/20110530081158/server.js:112
            res.render('track', { pins: user_.pins, layout: false });
                                             ^
TypeError: Cannot read property 'pins' of null
    at /home/node/node-service/releases/20110530081158/server.js:112:46
    at /home/node/.node_libraries/.npm/mongoose/1.3.6/package/lib/mongoose/query.js:778:22
    at [object Object].<anonymous> (/home/node/.node_libraries/.npm/mongoose/1.3.6/package/support/node-mongodb-native/lib/mongodb/collection.js:462:35)
    at [object Object].emit (events.js:67:17)
    at [object Object].<anonymous> (/home/node/.node_libraries/.npm/mongoose/1.3.6/package/support/node-mongodb-native/lib/mongodb/db.js:94:12)
    at [object Object].emit (events.js:64:17)
    at Socket.<anonymous> (/home/node/.node_libraries/.npm/mongoose/1.3.6/package/support/node-mongodb-native/lib/mongodb/connection.js:86:16)
    at Socket.emit (events.js:64:17)
    at Socket._onReadable (net.js:671:31)
    at IOWatcher.onReadable [as callback] (net.js:177:10)
  

Ответ №1:

Возврат данных для идентификатора, который не существует, является нормальной операцией, а не ошибкой, и поэтому err не устанавливается.

Попробуйте изменить if (!err) на if (!err amp;amp; user_) .

Ответ №2:

попробуйте переключить параметры обратного вызова >

 User.findById(user_id, function(user_, err ) {
    if (!err) {
        res.render('track', { pins: user_.pins, layout: false });
    } else {
        res.send("FAIL! "   err);
    }
});
  

Комментарии:

1. наверняка что-то не так с параметрами. Ошибка, по-видимому, заключается в том, что он !err возвращает true, даже когда пользователь не существует, а затем выдает ошибку о том, что pins не существует, в то время как родительский код user_ существует. можете ли вы использовать console.log() и посмотреть, какие два параметра передаются в случае, если user не существует?