Nodejs server 收到请求, 但是回应发不过去

Nodejs server 收到请求, 但是回应发不过去

前言:写一个读写mysql数据库的小练习。使用jquery 的$.post发送了一个注册用户请求,服务器收到后插入数据库。回复成功给客户端。 错误:数据库成功更新,但是回复发不过去,开始是socket hand up error.后来我装了个node v0.8.25版本,现在连错误都没有了。客户端仍然什么都收不到。

客户端你代码: var username = $(’#username’).val().trim(); var pwd = $(’#password’).val().trim(); $.post(‘http://myserver/’ + ‘reg’, {username : username , password: pwd}, function(data){ window.alert( data); });

服务端代码:

app.get( “/reg” , route.reg); app.post( “/reg”, route.doreg);

in route.js: exports.doreg = function( req ,res){ var msg = req.body;

userOperator.createUser( msg.username , msg.password , function( err , user){ if( err ){ res.send( {code: 501}); }else { res.send({ code:200, username: user.name , password: user.password});//断点可以跟踪到这里。 } }); };

这个东西折磨我两天了,一点儿头绪没有。求指导啊。


9 回复

根据你的描述,你在处理 Node.js 服务器响应客户端请求时遇到了问题。你提到客户端没有接收到任何响应,尽管服务器已经成功处理了请求并准备发送响应。以下是一些可能的原因及解决方案:

1. 确认请求方法

确保客户端发送的请求方法与服务器端定义的路由匹配。例如,$.post 发送的是 POST 请求,而你的服务器端定义了 /reg 路由的 POST 方法。

// 客户端代码
$.post('http://myserver/reg', {username: username, password: pwd}, function(data) {
    window.alert(data);
});
// 服务器端代码
app.post('/reg', route.doreg);

2. 检查中间件和错误处理

确保你已经正确地设置了中间件来解析请求体,并且没有错误处理程序阻止响应的发送。

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.json()); // 对于 JSON 格式的请求体
app.use(bodyParser.urlencoded({ extended: true })); // 对于 URL 编码的请求体

app.post('/reg', route.doreg);

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

3. 检查响应是否被正确发送

确保响应确实被发送到了客户端。你可以在发送响应之前添加日志来确认这一点。

// route.js
exports.doreg = function(req, res) {
    const msg = req.body;

    userOperator.createUser(msg.username, msg.password, function(err, user) {
        if (err) {
            console.error('Error creating user:', err);
            res.status(501).send({ code: 501 });
        } else {
            console.log('User created successfully:', user);
            res.status(200).send({
                code: 200,
                username: user.name,
                password: user.password
            });
        }
    });
};

4. 网络问题

确保没有网络问题或防火墙设置阻止了响应的发送。你可以尝试在不同的网络环境下测试,或者检查服务器的日志文件以获取更多信息。

5. 使用 Postman 或其他工具测试

使用 Postman 或类似工具手动发送 POST 请求到你的服务器,以确认服务器是否能够正常响应。

通过以上步骤,你应该能够找到并解决导致响应无法发送的问题。如果问题依然存在,请提供更多详细信息以便进一步诊断。


没有调用res.end()啦

send方法会自己end的,我也试了加上res.end(),还是没有任何反应。

是不是客户端的原因啊

总共只有这几行代码:

$(document).ready( function() { $(’#registerBtn’).on( ‘click’ , register); });

function register(){ var username = $(’#username’).val().trim(); var pwd = $(’#password’).val().trim(); $.post(‘http://127.0.0.1:3001/’ + ‘reg’, {username : username , password: pwd}, function(data){ //window.alert( data); window.alert(“haha”); }); }

而且请求已经发过来了啊。数据库都已更新。不知道怎么回事

哥们,你客户端是异步去取的,不要res.send回去啊,res.json返回。

是这样吗? res.json( 200,{username: user.name , password: user.password}); 还是不行。啊

谈不上耽误时间,有的时候错误就是出现在这种莫名其妙的小地方想找都找不到,多写写,编码风格就自然形成了,这种错误慢慢就少了。

根据你的描述,问题可能是由于网络配置、HTTP请求处理或响应发送的问题导致的。这里有几个可能的原因和解决方案:

  1. 检查路由处理

    • 确保app.post("/reg", route.doreg)中的route.doreg函数被正确调用。你可以添加日志来确认这一点。
  2. 确保响应被正确发送

    • 检查是否有任何未捕获的异常导致服务器提前关闭连接。确保res.send在所有情况下都被正确调用。
  3. 检查客户端请求

    • 确保客户端的请求确实到达了服务器。可以通过浏览器开发者工具或网络抓包工具(如Fiddler)来检查。
  4. 使用中间件来调试

    • 在你的Express应用中添加中间件来记录请求和响应信息,以帮助调试。

以下是一个改进后的代码示例:

// route.js
exports.doreg = function(req, res) {
    console.log('Received POST request to /reg');
    
    var msg = req.body;

    userOperator.createUser(msg.username, msg.password, function(err, user) {
        if (err) {
            console.error('Error creating user:', err);
            res.status(501).send({ code: 501 });
        } else {
            console.log('User created successfully:', user);
            res.status(200).send({ code: 200, username: user.name, password: user.password });
        }
    });
};

确保在客户端和服务端都有足够的日志输出来跟踪请求和响应。这样可以帮助你更好地理解请求流程,并找到问题所在。

如果以上方法仍无法解决问题,建议检查服务器的网络配置和防火墙设置,确保服务器能够正常接收和发送HTTP响应。

回到顶部