求指点,Nodejs中express-promise是如何实现无回调读取数据库的(附代码)

求指点,Nodejs中express-promise是如何实现无回调读取数据库的(附代码)

https://github.com/luin/express-promise

最近在看promise,不是很理解下面是如何实现的(github源码没看懂),promise最后的调用肯定会有.done()或者.then()里面带有回调啊。

app.get('/users/:userId', function(req, res) {
    res.json({
        user: User.find(req.params.userId),
        memo: Project.getMemo(req.params.userId)
    });
});

4 回复

要理解如何在Node.js中使用express-promise来实现无回调地读取数据库,我们需要首先了解Promises的基本概念。Promises是一种处理异步操作的方法,它允许我们以一种更简洁、更易于管理的方式处理异步代码。

解释

express-promise是一个Express中间件,它使得Express路由处理函数可以返回Promise对象,从而避免了传统的回调地狱。通过这种方式,我们可以更清晰地组织异步代码。

示例代码

假设我们有一个简单的Express应用,并且我们使用了一个名为User的模型来与数据库进行交互。以下是如何使用express-promise来实现无回调地读取数据库的示例:

  1. 安装依赖

    首先,确保你已经安装了expressexpress-promise-router

    npm install express express-promise-router
    
  2. 创建Express应用

    接下来,我们创建一个基本的Express应用,并设置路由处理函数:

    const express = require('express');
    const expressPromiseRouter = require('express-promise-router');
    const router = expressPromiseRouter();
    
    // 假设我们有一个User模型
    const User = require('./models/User'); // 这里你需要导入你的User模型
    
    // 定义路由处理函数
    router.get('/users/:userId', async (req, res) => {
        try {
            const user = await User.findById(req.params.userId);
            res.json({ user });
        } catch (error) {
            res.status(500).json({ error: 'An error occurred while fetching the user' });
        }
    });
    
    const app = express();
    app.use(router);
    
    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });
    

在这个例子中,我们使用了async/await语法来简化异步代码的编写。User.findById()是一个返回Promise的函数,这意味着我们可以直接在await后面调用它,而不需要使用回调函数。

总结

通过使用express-promise-router,我们可以使Express路由处理函数支持返回Promise,这使得异步代码更加简洁和易读。这样,我们就能够以更现代的方式处理异步操作,而无需陷入复杂的回调函数中。


不错的中间件,小巧 看了源码,覆盖重写了res.send(), res.json(), res.render() https://github.com/luin/express-promise/blob/master/lib/express_promise.js#L9 resolveAsync() 处理完再交给 原始的 res.send(), res.json(), res.render() response.

感谢!

express-promise 是一个扩展库,它能够让你在 Express 中使用 Promise,从而避免回调地狱。通过使用 express-promise,你可以将异步操作的处理逻辑与请求处理函数分离,使得代码更加清晰。

例如,在传统的 Express 应用中,你可能需要使用回调来处理数据库查询的结果:

const express = require('express');
const User = require('./models/user'); // 假设这是你的数据模型

const app = express();

app.get('/users/:userId', (req, res) => {
    User.find(req.params.userId, (err, user) => {
        if (err) {
            return res.status(500).json({ error: 'Database error' });
        }
        if (!user) {
            return res.status(404).json({ error: 'User not found' });
        }
        res.json({ user });
    });
});

app.listen(3000, () => console.log('App listening on port 3000!'));

通过引入 express-promise,你可以这样写:

首先,安装 express-promise-router,这是一个基于 express-promise 的路由处理器:

npm install express-promise-router

然后,你可以这样编写代码:

const expressPromiseRouter = require('express-promise-router');
const router = expressPromiseRouter();
const User = require('./models/user'); // 假设这是你的数据模型

router.get('/users/:userId', async (req, res) => {
    try {
        const user = await User.find(req.params.userId);
        if (!user) {
            return res.status(404).json({ error: 'User not found' });
        }
        res.json({ user });
    } catch (error) {
        res.status(500).json({ error: 'Database error' });
    }
});

const app = express();
app.use(router);

app.listen(3000, () => console.log('App listening on port 3000!'));

在这个例子中,router.get 使用了 asyncawait 来处理异步操作。这样,你就不再需要嵌套的回调函数,而是可以更清晰地处理错误和响应。

回到顶部