gpt4 book ai didi

node.js - 如何在 expressjs REST API 中修复 "TypeError: Cannot read property ' 正文“未定义””

转载 作者:可可西里 更新时间:2023-11-01 10:36:22 25 4
gpt4 key购买 nike

我正在使用 Express 设置 REST API,我最终定义了一些有效的端点和方法,突然出现错误:“TypeError:无法读取未定义的属性‘body’”

我是 JS 的新手,我正在尝试使用 mongodb、express 和 react 构建一个 webapp。

我一直在遵循一些指南(特别是这个指南,因为它也实现了 JWT:https://www.toptal.com/nodejs/secure-rest-api-in-nodejs)

我已经成功地为基本的 CRUD 操作构建了所有用户方法并公开了它们。一切正常,然后我尝试用中间件添加Auth进程,但出现了错误。

我寻找答案,最常见的错误是由于在路由之后调用了 body-parser。但就我而言,我在 user 路由之前调用 auth 路由,效果很好。

这是我的 git repo 以获取更多详细信息: https://github.com/pidanou/btb_api

const config = require("./config/env.config");

const express = require("express");
const bodyParser = require("body-parser");
const app = express();

const authRouter = require("./routes/auth.routes");
const userRouter = require("./routes/users.routes");

app.use(function(req,res,next){
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Allow-Methods',
'GET,HEAD,PUT,PATCH,POST,DELETE');
res.header('Access-Control-Expose-Headers', 'Content-Length');
res.header('Access-Control-Allow-Headers', 'Accept, Authorization,
Content-Type, X-Requested-With, Range');
if (req.method === 'OPTIONS') {
return res.send(200);
} else {
return next();
}
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));

authRouter.authRoutesConfig(app);
userRouter.userRoutesConfig(app);

app.listen(config.port, () => console.log(`Listening on port
${config.port}`));

authRoute 代码:

const verifyUserMiddle = require("../middlewares/verify.user.middle");
const authController = require("../controllers/auth.controller");

exports.authRoutesConfig = function (app) {

app.post('/auth', [
verifyUserMiddle.hasAuthValidFields(),
verifyUserMiddle.isPasswordAndUserMatch(),
authController.login()
])

}

Controller 代码:

const jwtSecret = require('../config/env.config').jwt_secret,
jwt = require("jsonwebtoken");
const cyrpto = require("crypto");

exports.login = (req, res) => {

try {
let refreshId = req.body.userId + jwtSecret;
let salt = crypto.randomBytes(16).toString("base64");
let hash = cyrpto.createHmac("sha512",
salt).update(refreshId).digest("base64");
req.body.refreshKey = salt;
let token = jwt.sign(req.body, jwtSecret);
let b = new Buffer(hash);
let refresh_token = b.toString("base64");
res.status(201).send({accessToken: token, refresh_token:
refresh_token});
}catch(err){
res.status(500).send({errors: err});
}

}

由于用户部分工作正常,我认为授权也可以,但事实并非如此。中间件似乎在 body-parser 之前被调用。错误首先发生在中间件中。

最佳答案

这里不是正文解析器问题 - 它工作正常。如您所见,您的 exports.login = (req, res) => {...} 具有 reqres 参数,但是如何他们收到了吗?

在您的 authController.login() 中使用 parantheses() 可以防止这种情况发生,只要它们存在,您的应用就会崩溃并出现此类错误。

所以改成这样:

  app.post('/auth', [
(your code),
authController.login
])

没有括号。

关于node.js - 如何在 expressjs REST API 中修复 "TypeError: Cannot read property ' 正文“未定义””,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56640654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com