新手跪求答案。。。nodejs的服务器没响应。按CTRL+C又可以了
发布于 3 个月前 作者 heguangda 942 次浏览 来自 问答

我最近在自学nodejs
自己写了一个前端页面通过ajax请求服务器,服务器收到信息后存到mysql 并把收到的信息打印出来

我发现有一个没有规律出现的问题,就是运行的好好的 忽然前端页面提交的信息后服务器没反应了,也不打印出来,但是按了ctrl+c后

又立马运行并打印出来收到的信息,,,求大神指教为什么啊

我是不是描述的有点混乱。。

14 回复

上代码。。。

@jxycbjhc

const http = require(‘http’); const querystring = require(‘querystring’) const db = require(’./db’); const url = require(’./url’);

var sql = ‘insert into table2 values(?,?)’; var getsql = ‘select * from table2’;

var server = http.createServer(function(req,res){ var reqdata = ‘’; switch(req.url){ case url.url.save: req.on(‘data’,function(chunk){ reqdata += chunk; console.log(reqdata); reqdata = querystring.parse(reqdata); console.log(reqdata.num); }); req.on(‘end’,function(){

			var params = [
			reqdata.num,
			reqdata.name
		];//传入的num和name

			console.log('end');
			db.dbconnection.query(sql,params,function(err,rows){
				if(err){
					haderror(err,res);
				}
				else{
					sqlend(res);
				}

			});
		});
		break;
	case url.url.get:
		console.log('enter get');
		req.on('data',function(chunk){
			reqdata += chunk;
			console.log(reqdata);
			reqdata = querystring.parse(reqdata);
			
		});
		req.on('end',function(){
			console.log('enter get end');
			db.dbconnection.query(getsql,function(err,rows){
				if(err){
					haderror(err,res);
				}
				else{
					getsqlend(res,rows);
				}
			});
		});
		break;
		default:console.log(req.url);
}

});

server.listen(3000,function(err){ console.log(‘server is running’); });

function sqlend(res){

		var success = querystring.parse("message=success");
		console.log(success);
		res.writeHead(200,{
			'contenType':'application/json',
			'Access-Control-Allow-Origin':'*'
		});
		
		res.end(JSON.stringify(success));

}

function getsqlend(res,rows){ var data = JSON.stringify(rows); res.writeHead(200,{ ‘contenType’:‘application/json’, ‘Access-Control-Allow-origin’:’*’ }); res.end(data);

}

function haderror(err,res){ console.log(err.code); res.end(err.code); }

刚学 代码可能有点乱

@jxycbjhc 这是服务器的代码。。.(’/db’)和(’./url’)分别是自己写的一个mysql数据引入和存储url的文件,,url 的代码是 const url = { save:’/save’, get:’/get’ }; module.exports.url = url;

./db的代码是

const mysql = require(‘mysql’);

const db={ host:‘localhost’, port:‘3306’, user:‘root’, password:‘1234’, database:‘fdatabase’ }

const dbconnection = mysql.createConnection({ host:db.host, port:db.prot, user:db.user, password:db.password, database:db.database });

dbconnection.connect();

module.exports.dbconnection = dbconnection;

好好格式化一下你的代码

const http = require('http');
const querystring = require('querystring');
const db = require('./service');
const url = {
    save: '/save',
    get: '/get'
};

var sql = 'insert into table2 values(?,?)';
var getsql = 'select * from table2';

var server = http.createServer(function (req, res) {
    var reqdata = '';
    console.log(req.url);
    switch (req.url) {
    case url.save:
        req.on('data', function (chunk) {
            reqdata += chunk;
            console.log(reqdata);
            reqdata = querystring.parse(reqdata);
            console.log(reqdata.num);
        });
        req.on('end', function () {
            var params = [
                reqdata.num,
                reqdata.name
            ];// 传入的num和name

            console.log('end');
            db.dbconnection.query(sql, params, function (err, rows) {
                if (err) {
                    haderror(err, res);
                } else {
                    sqlend(res);
                }
            });
        });
        break;
    case url.get:
        console.log('enter get');
        req.on('data', function (chunk) {
            reqdata += chunk;
            console.log(reqdata);
            reqdata = querystring.parse(reqdata);
        });
        req.on('end', function () {
            console.log('enter get end');
            db.dbconnection.query(getsql, function (err, rows) {
                if (err) {
                    haderror(err, res);
                } else {
                    getsqlend(res, rows);
                }
            });
        });
        break;
    default:console.log(req.url);
    }
});

server.listen(3000, function (err) {
    if (err) {
        console.warn();
    }
    console.log('server is running');
});

function sqlend (res) {
    var success = querystring.parse('message=success');
    console.log(success);
    res.writeHead(200, {
        'contenType': 'application/json',
        'Access-Control-Allow-Origin': '*'
    });

    res.end(JSON.stringify(success));
}

function getsqlend (res, rows) {
    var data = JSON.stringify(rows);
    res.writeHead(200, {
        'contenType': 'application/json',
        'Access-Control-Allow-origin': '*'
    });
    res.end(data);
}

function haderror (err, res) {
    console.log(err.code);
    res.end(err.code);
}

image.png 这是我的运行

你这个报错不也出来了吗。。。ER_NO_SUCH_TABLE

通过控制台打印我也遇到过这种问题,后来直接上了pm2就好了,想看打印直接pm2 log

但原因…是不是打印太多占用了太多的控制台缓冲区?

说另一个问题: reqdata = querystring.parse(reqdata); 应该放在’end’的回调中处理,这样reqdata才是真实的完整的数据

我没看代码…不过如果是windows系统的话…cmd或者powershell的快速编辑在设置里面关了试试…

同意楼上,快速编辑模式的时候,鼠标不小心点到cmd某个位置可能让正在运行的进程卡住

@peasonlee 噢噢噢 我懂了 谢谢

原因找到啦 感谢各位,特别是楼下提供问题答案的两位,是因为不小心点到windows的CMD的文字导致的,怪不得是随机的,感谢感谢

回到顶部