个人Nodejs REST 轻量级框架 源码已共享

个人Nodejs REST 轻量级框架 源码已共享

我发现,controller 是通过 return 来返回结果的。

如果 controller 中涉及异步的查询,那么所查询到的数据就无法通往外界。

在改进的过程中,controller 应该还是会变成接收 function (req, res) {} 的形式,并通过 res 来返回数据。

没有 github 地址吗?

9 回复

当然可以!以下是针对你提到的帖子内容进行的回答,包括如何处理异步操作以及提供一个简单的示例代码。


个人Node.js REST 轻量级框架 源码已共享

大家好,

最近我在开发一个轻量级的Node.js REST框架,旨在简化API的开发过程。我发现,控制器(controller)通常通过return来返回结果,但是当涉及到异步查询时,这样的做法会导致查询到的数据无法正确地传递出去。

为了更好地处理这种情况,我的建议是让控制器函数接收一个形如function(req, res) {}的形式,并通过res对象来返回数据。这样可以确保异步操作的结果能够被正确地处理和返回给客户端。

示例代码

下面是一个简单的示例,展示了如何使用这种模式来处理异步操作:

// 定义一个简单的路由处理器
const express = require('express');
const app = express();

// 示例控制器
const myController = {
    async getUserById(req, res) {
        try {
            const userId = req.params.id;
            const user = await fetchUserFromDatabase(userId); // 假设这是从数据库获取用户信息的异步函数
            res.json(user);
        } catch (error) {
            res.status(500).json({ error: 'Internal Server Error' });
        }
    }
};

// 使用中间件定义路由
app.get('/users/:id', myController.getUserById);

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

// 假设的异步函数,用于模拟从数据库获取用户信息
async function fetchUserFromDatabase(userId) {
    // 这里只是简单地模拟异步操作
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve({ id: userId, name: `User ${userId}` });
        }, 1000);
    });
}

在这个例子中,getUserById 控制器函数接收请求和响应对象,并通过res.json()将查询到的数据返回给客户端。这样可以确保即使在异步操作中也能正确地处理和返回数据。

GitHub 地址

如果你对这个框架感兴趣,可以在GitHub上查看完整的源代码。我会尽快上传并分享链接。感谢大家的支持!


希望这能帮助你理解和改进你的Node.js项目。如果有任何问题或建议,请随时留言交流。


不会玩 github 等能拿出手了会共享的

不该参照 Spring 的,应该参照 Rails

我看了一下 restify的风格,没有 spring 的好 我喜欢自动注入,反转控制

自动注入就是hibernate的转型而矣,IOC就是@,没啥难度,用nodejs自己写一个更容易实现。

基本注入已完成,就差路径映射变量处理

在Node.js中创建一个轻量级的REST框架时,确实会遇到如何处理异步操作并正确返回结果的问题。通常,控制器(controller)函数需要接收请求对象(req)和响应对象(res),并在完成操作后通过res对象将结果返回给客户端。

示例代码

以下是一个简单的例子,展示了一个处理异步查询并正确返回结果的控制器:

const express = require('express');
const app = express();

app.use(express.json());

// 假设这是一个模拟数据库查询
function asyncQuery(query, callback) {
    setTimeout(() => {
        const result = { id: 1, name: 'Example' }; // 模拟查询结果
        callback(null, result);
    }, 1000); // 模拟异步延迟
}

app.get('/api/items/:id', (req, res) => {
    const { id } = req.params;

    asyncQuery(id, (err, data) => {
        if (err) {
            return res.status(500).json({ error: 'An error occurred' });
        }
        res.json(data);
    });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

在这个例子中:

  • asyncQuery 函数模拟了一个异步数据库查询。
  • 控制器函数接收请求参数(req.params.id)并调用 asyncQuery
  • asyncQuery 使用回调函数来处理查询结果或错误。
  • 控制器通过 res 对象将查询结果或错误信息返回给客户端。

解释

  • Express:使用 Express 框架来简化路由处理。
  • asyncQuery:模拟异步数据库查询。
  • 回调函数:异步操作完成后,通过回调函数传递结果或错误。
  • 错误处理:在控制器中检查是否有错误,并相应地处理它们。

如果你想要查看完整的源码,可以考虑将上述代码片段扩展成一个完整的项目,并将其推送到 GitHub 上,这样其他人就可以轻松地下载和使用你的框架了。

回到顶部