Nodejs如何实现提供cgi服务的后台,根据请求路由调用不同方法返回json数据给前台?

Nodejs如何实现提供cgi服务的后台,根据请求路由调用不同方法返回json数据给前台?

不用express的话,只用node可以做到么? 我现在只知道用http创建一个服务端: http.createServer(function(req, res) { res.end(‘hello world’); }); 但是怎么根据不同的url来写不同的逻辑处理代码呢? 比如我想: svr.get(’/’, function(req, res) { //业务处理1 //返回给前台json });

  1. 不清楚怎么用nodejs根据不同的url来进入不同的处理模块
  2. 我不清楚怎么返回json给前台
  3. 在上面这段代码里,业务处理1应该是一个异步的代码吧,不然如果并发量大,就会堵塞服务器,但是怎么样把业务处理1变成异步的代码呢?直接包一层setImmediate吗? 谢谢~

7 回复

当然可以!我们可以使用 Node.js 的内置 http 模块来创建一个简单的 CGI 服务,并根据不同的 URL 路由调用不同的处理逻辑。为了更好地处理异步操作并返回 JSON 数据,我们可以使用一些辅助库,例如 querystring 来解析查询字符串。

以下是一个完整的示例代码:

const http = require('http');
const url = require('url');
const querystring = require('querystring');

const server = http.createServer((req, res) => {
    // 解析请求的 URL
    const parsedUrl = url.parse(req.url);
    const path = parsedUrl.pathname;
    const query = querystring.parse(parsedUrl.query);

    // 根据不同的路径调用不同的处理函数
    switch (path) {
        case '/':
            handleHome(req, res);
            break;
        case '/api/data':
            handleData(req, res, query);
            break;
        default:
            sendResponse(res, 404, { error: 'Not Found' });
            break;
    }
});

function handleHome(req, res) {
    // 业务处理1:模拟异步操作
    setTimeout(() => {
        const data = { message: 'Hello from Home!' };
        sendResponse(res, 200, data);
    }, 1000);
}

function handleData(req, res, query) {
    // 业务处理2:模拟异步操作
    setTimeout(() => {
        const data = {
            query: query,
            message: 'Hello from Data API!'
        };
        sendResponse(res, 200, data);
    }, 1000);
}

function sendResponse(res, statusCode, data) {
    res.writeHead(statusCode, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(data));
}

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

代码解释

  1. 创建 HTTP 服务器:

    • 使用 http.createServer 创建一个 HTTP 服务器。
    • 在回调函数中,解析请求的 URL 并根据路径调用不同的处理函数。
  2. 解析 URL:

    • 使用 url.parse 解析请求的 URL。
    • 获取路径 pathname 和查询参数 query
  3. 路由处理:

    • 使用 switch 语句根据不同的路径调用不同的处理函数。
  4. 处理函数:

    • handleHomehandleData 是两个示例处理函数,它们模拟了异步操作(通过 setTimeout)并返回 JSON 数据。
    • 这些处理函数中的业务逻辑可以根据实际需求进行修改。
  5. 发送响应:

    • sendResponse 函数用于设置响应头并发送 JSON 数据。
    • 使用 res.writeHead 设置状态码和内容类型。
    • 使用 res.end 发送 JSON 格式的响应体。
  6. 启动服务器:

    • 使用 server.listen 启动服务器,并监听指定端口(例如 3000)。

这样,你就可以根据不同的 URL 路径调用不同的处理逻辑,并返回 JSON 数据给前端。


干吗不用 express ?不用的话,首先你得自己搞一套简单的路由系统出来。

论把 npm 上 Top 100 的库混个脸熟的重要性:https://www.npmjs.org/browse/depended 你的需求主要用到 express 和 async

1.var url = require(‘url’); switch(url.pathname){ case ‘/’ : do1(); case ‘/create’: do2(); … } 2.前端用HTTP Get从restful接口获得json数据。 3.是不是router后都丢给promise可以满足你的要求,我没试过做这种需求。

大家觉得用express比较方便咯? 我只是想只看只用nodejs怎么实现 我去看看express怎么搞 谢谢~

话说有人了解过这个么: http://hapijs.com/ 这个有什么特点呢? 跟express相比有什么优势劣势?

当然可以。如果你希望使用Node.js实现一个简单的CGI服务后台,并根据不同的URL路由调用不同的处理函数以返回JSON数据,你可以通过手动解析URL来区分不同的路由,并使用异步处理来确保高并发情况下的性能。

以下是一个简单的示例代码:

const http = require('http');

function handleRequest(req, res) {
    // 解析URL以确定路由
    const urlParts = req.url.split('?');
    const path = urlParts[0];
    
    switch (path) {
        case '/':
            handleHome(req, res);
            break;
        case '/api/data':
            handleData(req, res);
            break;
        default:
            sendResponse(res, 404, { message: 'Not Found' });
    }
}

function handleHome(req, res) {
    setTimeout(() => {
        sendResponse(res, 200, { message: 'Welcome to Home Page' });
    }, 500); // 模拟异步操作
}

function handleData(req, res) {
    setTimeout(() => {
        sendResponse(res, 200, { message: 'Here is your data', data: [1, 2, 3] });
    }, 500); // 模拟异步操作
}

function sendResponse(res, status, json) {
    res.writeHead(status, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(json));
}

const server = http.createServer(handleRequest);

server.listen(3000, () => {
    console.log('Server is listening on port 3000');
});

解释

  1. 路由处理:我们通过解析req.url来决定调用哪个处理函数。例如,//api/data 分别对应不同的业务逻辑。
  2. 异步处理:为了防止阻塞主线程,我们使用setTimeout模拟了一个耗时的操作。在实际应用中,这可能涉及到数据库查询、文件读写等操作。
  3. 发送响应:我们定义了sendResponse函数用于发送HTTP响应,它会设置正确的Content-Typeapplication/json并返回JSON格式的数据。

并发处理

对于更复杂的异步处理,建议使用如async/await语法或者第三方库如bluebird来简化异步代码,确保不会出现阻塞问题。此外,使用如cluster模块可以更好地利用多核CPU进行负载均衡,提高应用的并发处理能力。

回到顶部