node.js - 如何处理从 API Web 服务 (ExpressJS) 检索的数据/json?
问题描述
我是 NodeJS 和 ExpressJS 的新手。我创建了一个处理登录帖子的 AuthController。
exports.login = async (req, res, next) => {
try {
const email = req.body.email;
const password = req.body.password;
const user = await User.findOne({ email }).select("+password");
if (!user) {
const error = new Error("Wrong Credentials");
error.statusCode = 401;
throw error;
}
const validPassword = await user.validPassword(password);
if (!validPassword) {
const error = new Error("Wrong Credentials");
error.statusCode = 401;
throw error;
}
const token = jwt.encode({id: user.id}, config.jwtSecret);
res.send({user, token});
} catch(err) {
next(err);
}
}
我想在我的 Web 应用程序中使用此方法让用户登录。如果用户成功登录,我会在浏览器中收到包含用户和令牌的 json 响应。那不是我想要的。api 登录的 url 是:/api/auth/login。我在我的 Web 应用程序中创建了一个函数:
router.post('/login', async (req, res, next) => {
var apiResponse = await authController.login(req, res, next);
res.render('profile.ejs', {user: apiResponse.user});
});
我不断收到 authController.login 不是函数的错误。我的问题是如何使用我的 API 中的方法并在我的 web 应用程序中使用响应?有人可以帮我吗?
解决方案
您可以像下面的代码一样执行此操作:
router.post('/login', authController.login, async (req, res, next) => {
res.render('profile.ejs', {user: apiResponse.user});
});
请阅读有关Express Middleware的文档。
更新:中间件
确保您的 authController 如下所示:
exports.login = async (req, res, next) => {
try {
const email = req.body.email;
const password = req.body.password;
const user = await User.findOne({ email }).select("+password");
if (!user) {
const error = new Error("Wrong Credentials");
error.statusCode = 401;
throw error;
}
const validPassword = await user.validPassword(password);
if (!validPassword) {
const error = new Error("Wrong Credentials");
error.statusCode = 401;
throw error;
}
const token = jwt.encode({id: user.id}, config.jwtSecret);
// passing your data to next function
// you can change exampleData with the 'variable' you want
req.exampleData = { user, token }
next();
} catch(err) {
next(err);
}
}
如果您的 authController 与您的路由相同的根目录(“文件夹”),则使其看起来像这样:
const { login } = require('./authController');
所以,现在,你可以像这样调用 authController:
router.post('/login', login, async (req, res, next) => {
// your data: "user" and "token" from middleware
const { exampleData } = req;
console.log(exampleData);
res.render('profile.ejs', {user: exampleData});
});
我希望它可以帮助你。
推荐阅读
- php - PHP 通过 AnonFiles 以 html 形式发布文件
- mysql - 如何创建一个列来存储 MySQL 中另一个表中所有相关记录的总和
- laravel - 发布请求 Laravel 和 Vue 的外键
- html - 在反应酶单元测试中获取 HTML 元素样式
- android - Firebase 仅在其为空时更新字段
- arrays - grep 只是多个文件的最后一次出现
- php - 在选择选项中显示来自 mysql 的一张表?
- android - 一切都在 Unity 中有效,但在 Android 上无效
- android - 我没有检索价值
- python - 如何创建多级 json 文件,然后从 python 中读取特定值?