Nodejs 接受异步请求,如何把JSON返回给客户端

Nodejs 接受异步请求,如何把JSON返回给客户端

如题,客户端发起异步请求,如何在服务端处理返回给它JSON呢, 下面是客户端示例代码: $.ajax({ url: ‘/ajaxTest’, type: ‘GET’, success: function(data){ console.log(‘success!’) console.log(data.toString()); }, error: function(xmlHTTPRequest, status, error){ console.log(status); alert(‘cuowu!’); } })

服务端示例: // 这里getUserList是去异步查数据库了
exports.ajax = function(req, res, next){ getUserList(function(err, users){ if(err) return next(err); return users; }); });

到这里,用Firebug监听请求localhost:3000/ajaxTest,发现请求状态一直是转圈圈,很久时间之后,就显示请求失败了,服务端控制台也没打印出什么,不知道服务端这样处理对不对,

PS:我这是本地测试的,localhost,是本地测试异步请求有问题吗?还是必须放服务器上测试才行呢


7 回复

Node.js 接受异步请求并返回 JSON

在您的问题中,您提到客户端通过 $.ajax 发起一个异步请求,并希望服务端能够处理这个请求并将 JSON 数据返回给客户端。然而,当前的服务端代码并没有正确地将结果返回给客户端。

客户端代码

首先,我们来看一下客户端的代码:

$.ajax({
    url: '/ajaxTest',
    type: 'GET',
    success: function(data) {
        console.log('success!');
        console.log(data.toString());
    },
    error: function(xmlHTTPRequest, status, error) {
        console.log(status);
        alert('错误!');
    }
});

这段代码发起一个 GET 请求到 /ajaxTest,并在成功时打印数据,在失败时显示错误信息。

服务端代码

接下来,我们来修改服务端的代码以确保能够正确处理异步请求并返回 JSON 数据。假设 getUserList 是一个异步函数,用于从数据库获取用户列表。

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

// 假设 getUserList 是一个异步函数
async function getUserList() {
    // 模拟异步操作,例如从数据库获取数据
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve([
                { id: 1, name: 'Alice' },
                { id: 2, name: 'Bob' }
            ]);
        }, 1000); // 模拟延迟
    });
}

app.get('/ajaxTest', async (req, res) => {
    try {
        const users = await getUserList();
        res.json(users); // 返回 JSON 数据
    } catch (err) {
        res.status(500).json({ error: err.message }); // 处理错误
    }
});

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

在这个例子中,我们使用了 Express 框架来简化 HTTP 服务的开发。getUserList 函数是一个模拟的异步函数,它会模拟从数据库获取数据的过程。我们使用 res.json() 方法将 JSON 数据直接返回给客户端。

解释

  1. 客户端:使用 $.ajax 发起一个 GET 请求到 /ajaxTest
  2. 服务端:定义了一个路由 /ajaxTest,该路由处理 GET 请求。getUserList 函数被调用并等待其完成,然后将结果作为 JSON 返回给客户端。
  3. 错误处理:如果 getUserList 抛出异常,我们将返回一个 500 状态码和错误信息。

测试

确保您的服务端代码正确运行后,可以使用浏览器或工具(如 Postman 或 Firebug)来测试 /ajaxTest 路由。您应该看到客户端成功接收到 JSON 数据,并在控制台打印出来。

本地测试是没有问题的,您可以在本地进行开发和调试。只有在部署到生产环境时,才需要考虑服务器配置和网络问题。


补充一点:服务端的getUserList方法是经过测试,能正常返回数据的

刚刚在回调里加了个render试了下,竟然请求成功了! 好了,只剩最后一个问题,如何返回JSON给客户端呢,render貌似只能是字符串?

服务器端试试, JSON.parse(str);返回相应对象。或者就传递,json格式的字符串,然后前端页面,用eval(’(’+data+’)’)解析成json对象。

嗯,JSON.parse传的字符串格式很严格,必须是名值对都用双引号包起来,否则会解析出错!后来用JSON.stringify在服务端序列后回传,发现到了客户端会转义! 服务端JSON[{“pass”:“111”,“name”:“e45”,"_id":“5152d48a60b39f5418000001”}, 传给客户端之后竟然 成了 [{“pass”:“111”,“name”:"e45" 坑啊~(╯_╰) ,不得已只能在ajax回调里对字符串用正则替换之后, 才算正常了。

可以使用 res.json({users: users});

从你的描述来看,问题主要在于服务端没有正确地将数据返回给客户端。以下是一个正确的示例代码来说明如何处理这个问题:

服务端代码

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

app.get('/ajaxTest', (req, res, next) => {
    getUserList((err, users) => {
        if (err) return next(err); // 如果有错误,传递给 Express 错误处理中间件
        res.json(users); // 将用户数据以 JSON 格式返回给客户端
    });
});

function getUserList(callback) {
    // 模拟异步操作,例如从数据库获取数据
    setTimeout(() => {
        const users = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
        callback(null, users);
    }, 2000);
}

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});

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

解释

  1. res.json(users): 这行代码将 users 数据作为 JSON 格式返回给客户端。Express 的 res.json() 方法会自动设置响应头 Content-Type: application/json

  2. 错误处理: 使用中间件处理可能发生的错误。如果在 getUserList 函数中发生错误,将其传递给 Express 的错误处理中间件。

  3. 模拟异步操作: getUserList 函数使用 setTimeout 模拟了一个异步数据库查询操作,实际生产环境中可以替换为真实的数据库查询逻辑。

客户端代码

客户端的 AJAX 请求保持不变,如下所示:

$.ajax({
    url: '/ajaxTest',
    type: 'GET',
    success: function(data) {
        console.log('success!');
        console.log(JSON.stringify(data));
    },
    error: function(xmlHTTPRequest, status, error) {
        console.log(status);
        alert('cuowu!');
    }
});

总结

确保服务端在处理完异步请求后正确返回 JSON 数据,并且客户端能够正确接收并处理这些数据。上述代码展示了如何使用 Express 和 jQuery 实现这一功能。本地测试是没有问题的,不需要部署到服务器上进行测试。

回到顶部