【问题标题】:Cannot read property 'password' of undefined in Node Api无法读取 Node Api 中未定义的属性“密码”
【发布时间】:2018-04-07 18:09:15
【问题描述】:

我正在尝试在 Nodejs 中创建一个休息 API。我已经定义了我的模型,并在我的路线中引用了我的模型并使用了该模型。我在下面给出了所有代码细节。请有人帮助我。

这是我的路由器文件:index.js

const routes = require('express').Router();
const User=require('./model');
const bcrypt=require('bcryptjs');
const config=require('../config');
routes.post('/register',function(req,res){
  var hashPassword=bcrypt.hashPassword(req.body.password,8);
  User.create({
    name:req.body.name,
    password:hashPassword,
    admin:req.body.admin
  },function(err,user){
    if(err){
      return res.status(500).send("There is the problem with registering");
    }
    var payload={
      "id":"user._id"
    }
    var token=jwt.sign(payload,config.secret,{
      expiresIn: 86400
    })
    res.status(200).send({
      auth:true,
      token:token
    })
  })
})

这是我的模型:model.js

// get an instance of mongoose and mongoose.Schema
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// set up a mongoose model and pass it using module.exports
module.exports = mongoose.model('User', new Schema({ 
    name: String, 
    password: String, 
    admin: Boolean 
}));

这是我的 server.js:

// Bring in our dependencies
const app = require('express')();
const routes = require('./routes');
const config=require('./config');
const mongoose=require('mongoose');
const bodyparser=require('body-parser');
const cluster=require('cluster');
const numCPUs = require('os').cpus().length;

//  Connect all our routes to our application

if(cluster.isMaster){
  console.log('Master process running');
  for(var i=0;i<=numCPUs;i++){
    cluster.fork(i);
}}else{
app.use('/api', routes);
app.set('port', 3000);
app.use(bodyparser.urlencoded({extended:false}));
app.use(bodyparser.json());
app.listen(app.get('port'));
console.log('Server listening on port ' + app.get('port'));
}

mongoose.connect(config.database);
mongoose.connection.on('connected',()=>{
  console.log("Database Connected");
})
mongoose.connection.on('error',(err)=>{
  if(err){
      console.log(err);
  }
})
cluster.on('exit',(worker,code,signal)=>{
  console.log('worker %d died (%s). Restarting...',worker.process.pid,code||signal);
  cluster.fork();
})

当我尝试从邮递员发布数据时,我遇到了错误。

TypeError: Cannot read property 'password' of undefined
    at F:\project\node-project\jwt-auth\routes\index.js:14:49
    at Layer.handle [as handle_request] (F:\project\node-project\node_modules\express\lib\router\layer.js:95:5)
    at next (F:\project\node-project\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (F:\project\node-project\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (F:\project\node-project\node_modules\express\lib\router\layer.js:95:5)
    at F:\project\node-project\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (F:\project\node-project\node_modules\express\lib\router\index.js:335:12)
    at next (F:\project\node-project\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (F:\project\node-project\node_modules\express\lib\router\index.js:174:3)
    at router (F:\project\node-project\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (F:\project\node-project\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (F:\project\node-project\node_modules\express\lib\router\index.js:317:13)
    at F:\project\node-project\node_modules\express\lib\router\index.js:284:7

我找不到我在哪里犯错了?有人请帮我找出错误。

【问题讨论】:

  • 我认为这是因为您在路由之后注册了正文解析器。看看这个,看看它是否有帮助stackoverflow.com/a/48132442/8954866
  • 我现在没有收到该错误。感谢您的帮助。我收到一个新错误。试图解决这个问题。 TypeError: bcrypt.hashPassword 不是函数
  • 我没有看到hashPassword 列在bcrypt api 中,也许你的意思是hashnpmjs.com/package/bcrypt#api

标签: javascript node.js mongodb api


【解决方案1】:

我找不到我在哪里犯错了?有人请帮我找出错误

该错误与快速堆栈的工作方式有关。您注册中间件、路由等的顺序在 express 中很重要。

来自Express JS Guide

Express 应用程序本质上是一系列中间件函数调用。

将 express 应用程序可视化为一系列函数调用 可能会有所帮助。

这意味着当您执行以下操作时:

const routes = require('./routes');
app.use('/api', routes);
.
.
.
app.use(bodyparser.json());

您是说在堆栈中的路由之后使用body-parser,因此为什么会收到错误TypeError: Cannot read property 'password' of undefined,因为在您的路由定义中,req.body 尚未被body-parser 填充。

一般有两种方法可以解决这个问题:

1) 改变顺序:

app.use(bodyparser.json())
.
.
.
app.use('/api', routes);

2) 在路由文件中使用body-parser 作为中间件:

const routes = require('express').Router();
const bodyParser = require('body-parser')
const jsonParser = bodyParser.json()

routes.post('/register', jsonParser, function(req,res){
  ...
})

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2018-10-01
    • 2018-01-27
    • 2012-12-04
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多