【问题标题】:return resolve error in node function在节点函数中返回解析错误
【发布时间】:2017-01-04 16:55:17
【问题描述】:

为什么 usernametoid 函数不返回实际 ID?导致我试图发送用户数据的结果作为返回。在这种情况下,我只想发送 userdata 的 _id 属性。但是好像不行。

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

变量用户数据的输出:

  {
      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'});
    });
}

【问题讨论】:

    标签: javascript node.js mongodb mean-stack


    【解决方案1】:

    因为您没有将获取的用户正确传递给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 能够像那样获取它。

    而且,您应该在 server.js 中要求 mongoose

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

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

    【讨论】:

    • 这似乎是对的,但由于某种原因,我仍然无法让它工作。在 user.exec 之后
    • console.log(userdata); 在解决之前给你什么?
    • IT 似乎没有什么是不会执行的
    • console.log(user); 之后呢?
    • 和我的变量 userdata 的输出一样:聊天?
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2014-05-28
    • 1970-01-01
    • 2020-01-06
    • 2018-01-24
    相关资源
    最近更新 更多