返回解析节点函数中的错误

时间:2016-08-28 15:49:06

标签: javascript node.js mongodb mean-stack

为什么不能使用usernametoid函数返回acual id?因为我试图发送userdata的结果作为返回。在这种情况下,我只想发送userdata的_id属性。但似乎它不会起作用。

console.log(userdata._id); // works
        return resolve(userdata._id); // wont work.

变量userdata的输出:

  {
      cash: 7300002,
      bank: 0,
      xp: 0,
      rank: 1,
      points: 1,
      location: 1,
      health: 100,
      protection: 1,
      attack: 1,
      family: '0',
      password: 'jKa4qC7pRCgE5jvzD9Vv1pRUNxFlQEM7Jpq/IoJ/sUWOAv1Wx1RI/j/Vu6Zf8zyNkCFcg3QBtdfAC+lmPS8KIA==',
      profileImageURL: 'modules/users/client/img/profile/default.png',
      roles: [ 'user' ],
      created: Sat Aug 27 2016 12:33:55 GMT-0400 (EDT),
      __v: 0,
      username: 'signature',
      provider: 'local',
      salt: '4ySlrr9ggESxBB3dR5bx4Q==',
      _id: 57c1c0f3b6b20c011242bf22 }

当我这样做:`return resolve(userdata._id)它会得到这个错误:

/server/factory/user_factory.js:52
                return resolve(userdata._id);
                                       ^

    TypeError: Cannot read property '_id' of null

node.js调用:

var articles = require('../controllers/articles.server.controller'),
    path = require('path'),
  mongoose = require('mongoose'),
  Article = mongoose.model('Article'),
    Users = mongoose.model('User'),
  errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller'));


var userFunc   = require('../factory/user_factory.js');
    app.post('/api/kill', function (req, res) {

        console.log("starting");
        var username = "signature";//req.query.username;

        var result = ["test service"];

        var data = req.user;
        userFunc.usernametoid(username).then( function (otherplayerid) {


            if (!(otherplayerid)) {
                console.log("other player is acually " + otherplayerid);
                result.push("denne brukeren finnes ikke! " + otherplayerid);

            } else {

                userFunc.usernametoid(otherplayerid).then( function (otherplayer) {
                    if (data.location != otherplayer.location) {
                        result.push("Du er ikke i samme lokasjon som " + username);
                        result.push(data.location + " vs " + otherplayer.location);
                    } else {

                        userFunc.addCash(req.user._id,100000);
                        result.push("starter lokasjonisering");

                    }
                });
            }
            res.json(result);
        });

});

用户工厂:

var articles = require('../controllers/articles.server.controller'),
    path = require('path'),
    mongoose = require('mongoose'),
    Article = mongoose.model('Article'),
    Users = mongoose.model('User'),
    errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller'));




exports.usernametoid = usernametoid;

    function usernametoid(id) {

    return new Promise( function (resolve, reject) {
        var query = Users.findOne( { username : id } );

        //  var query = Users.find({_id:id});
        query.exec(function(err, userdata) {
            if (err){
                return reject({err : 'Error while getting user info'});
            }


            console.log(userdata._id);
            return resolve(userdata);
        });

    }, function (){
        return reject({err : 'error while fetching cash'});
    });
}

1 个答案:

答案 0 :(得分:0)

因为您未将提取的用户正确传递给query.exec

你需要这样做:

var Users  = require('../models/users-model.js');

function usernametoid(id) {
    return new Promise( function (resolve, reject) {
        Users.findOne({ username : id }).then( function(user){
          //If you use lodash you can do _.isNull(user)
          if(user == null){
            return reject({error : 'User not found'});
          }

          user.exec(function(userdata, error) {
              if(userdata){
                return resolve(userdata);
              } 
              if(error){
                 return reject({error : 'Error while executing query'});
              }
           });
        });
    });
}

我真的不明白为什么要像这样导入Users Model。我不认为Node能够像那样获取它。

而且,您应该在mongoose

中要求server.js

要捕获拒绝,您需要以下代码:

UserFactory.userNameToId(id).then( function(response){
  if(response.error){
    console.log('error '+response.error);
  }
  if(response){
    console.log('Got response '+response);
  }
});