相关疑难解决方法(0)

Node.js + Express.js应用程序的错误处理原则?

与其他框架相比,Node.js + Express.js应用程序中的错误报告/处理似乎有所不同.我是否理解它的工作原理如下?

A) 通过接收它们作为回调函数的参数来检测错误.例如:

doSomethingAndRunCallback(function(err) { 
    if(err) { … }
});
Run Code Online (Sandbox Code Playgroud)

B) 通过调用next(err)在MIDDLEWARE中报告错误.例:

handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}
Run Code Online (Sandbox Code Playgroud)

C) 通过抛出错误报告 ROUTES中的错误.例:

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});
Run Code Online (Sandbox Code Playgroud)

d) 处理通过配置通过app.error自己的错误处理的错误()或使用通用连接错误处理程序.例:

app.error(function(err, req, res, next) {
    console.error(err);
    res.send('Fail Whale, yo.');
});
Run Code Online (Sandbox Code Playgroud)

这四个原则是Node.js + Express.js应用程序中所有错误处理/报告的基础吗?

node.js express

176
推荐指数
2
解决办法
4万
查看次数

如何使用 JWT 刷新令牌生成新的访问令牌

我正在使用 Node.js 和 Express 来处理 JWT 身份验证。首先,每次创建和验证用户时,我都会存储一个refresh token内部User集合:

const refreshToken = await jwt.sign({ userId: decoded.user }, process.env.JWT_Refresh_Key);
const user = await User.updateOne({ _id: mongoose.Types.ObjectId(decoded.user) }, { refresh_token: refreshToken, status: true });
Run Code Online (Sandbox Code Playgroud)

成功登录后生成 JWT 访问令牌(15 分钟后过期):

const token = await jwt.sign(
                { email: user.email, userId: user._id, role: user.role },
                process.env.JWT_Key,
                { expiresIn: '15m' });
res.status(200).json({success: true, token: token});
Run Code Online (Sandbox Code Playgroud)

然后access token存储在localStorage由 Angular Http Interceptor 和 auth 方法处理。15分钟后,token处理请求将无效,所以我需要使用refresh token存储在数据库中的。

正在调用刷新方法AuthService.ts …

javascript node.js jwt angular

8
推荐指数
1
解决办法
1万
查看次数

NodeJs 中的 next() 是什么?

我是来自 Java 背景的 NodeJs 新手,我试图了解约定next()调用的使用。

我已经浏览了以下帖子 -
1. javascript node.js next()
2. https://www.naeemrana.com/node-js/express-js-middleware-what-is-next/
3.何时在 Node.js 中使用 next() 并返回 next()

我可以理解的是 next() 类似于回调,或者可能是当前函数执行后要执行的下一个函数的引用,
也理解建议使用return next();而不是next();避免函数被重新执行。

以下是来自链接之一的示例代码 -

app.get('/users/:id', function(req, res) {
    var user_id = req.params.id;

    if(user_id) {
      // do something
    } else {
      next(); // here comes middleware.
    }
});
Run Code Online (Sandbox Code Playgroud)

我这里不明白的是正在执行的函数没有第三个参数,
但它确实调用了 next() 函数,这里的想法是什么?
此约定的使用仅用于路由逻辑吗?
next() 是回调吗?它是对下一个要执行的函数的引用吗?或者是其他东西?

javascript node.js

6
推荐指数
1
解决办法
9000
查看次数

Express JS对请求使用异步功能

app.use(async function(req, res, next) {
    try {
        var myres = await new Promise((resolve, reject) => {
            mysql_connection.query("select * from Users;", (err, rows) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(rows);
                }
            });
        });
    } catch (error) {
        console.log(error);
    }
});
Run Code Online (Sandbox Code Playgroud)

问题是。使用异步功能能够将等待用于数据库查询可以吗?我担心这可能会在expressjs方面引起一些问题。

node.js express async-await

4
推荐指数
2
解决办法
2835
查看次数

route('next') 在 ExpressJS 中做什么?

文档中它说:

你可以提供多个回调函数,它们的行为就像中间件,除了这些回调可以调用 next('route') 来绕过剩余的路由回调。您可以使用此机制对路由施加前提条件,然后在没有理由继续当前路由的情况下将控制权传递给后续路由。

这是否意味着如果我写这样的路线:

app.get('/', function(req, res, next) {
    if (!req.params.id) {
        res.statusCode(400).send({error: "id parameter is required"});
        next('route');
    } else {
        next();
    }
}, function(req, res) {
    res.send({something: 'something'})
});
Run Code Online (Sandbox Code Playgroud)

并且params.idundefined,那么下一条路线不会被执行,但如果它存在,它会吗?

基本上,编码/命名约定让我有点困惑。为什么不next(false)代替next('route')

javascript node.js express

3
推荐指数
1
解决办法
871
查看次数

标签 统计

node.js ×5

express ×3

javascript ×3

angular ×1

async-await ×1

jwt ×1