问一个Nodejs提交表单的问题

问一个Nodejs提交表单的问题

最近在看这个:https://github.com/nswbmw/N-blog/wiki/第1章–一个简单的博客, 然后,照着写了下,发现注册提交表单时,要提交好久,且最终会失败。但是没有报错,求指点迷津。。。 <pre> app.post(’/reg’,function(req,res){ var name=req.body.name, password=req.body.password, password_re=req.body[‘password-repeat’]; //校验两次输入的密码是否一致 if(password!=password_re){ req.flash(‘error’,‘两次输入的密码不一致!’); return res.redirect(’/reg’); //返回注册页 } //生成密码的md5值 var md5=crypto.createHash(‘md5’), password=md5.update(req.body.password).digest(‘hex’); var newUser=new User({ name:name, password:password, email:req.body.email });

	//检查用户名是否已存在
	User.get(newUser.name,function(err,user){
		if(user){
			req.flash('error','用户已存在');	
			return res.redirect('/reg');	//返回注册页
		}
		//如果不存在则是新增用户
		newUser.save(function(err,user){
			if(err){
				req.flash("error",err);
				return res.redirect('/reg');	//注册失败返回主页
			}
			req.session.user = user;	//用户信息存入session
			req.flash('success',"注册成功!");
			return res.redirect('/');  注册成功返回主页
		});			
	});
res.end();
});

</pre>


5 回复

当然可以!根据你提供的内容,我将详细解释并提供一些可能的解决方案,以帮助你解决Node.js中提交表单时遇到的问题。

问题分析

从你的描述来看,注册表单提交时需要很长时间,并且最终会失败。虽然没有报错信息,但问题可能是由于以下几个原因:

  1. 数据库查询或操作超时:如果数据库查询或保存操作耗时过长,可能会导致请求超时。
  2. 异步操作未正确处理:在处理异步操作(如数据库查询)时,如果没有正确处理回调函数,可能会导致逻辑错误。
  3. 中间件或路由配置问题:某些中间件或路由配置可能导致请求处理异常。

示例代码与解释

1. 确保使用了正确的中间件

确保你在应用中使用了适当的中间件来解析表单数据,例如 body-parser

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

const app = express();

// 使用body-parser中间件
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

2. 优化代码逻辑

确保异步操作正确处理,避免阻塞或超时。

const crypto = require('crypto');
const User = require('./models/User'); // 假设User模型已经定义好

app.post('/reg', function (req, res) {
    const name = req.body.name;
    const password = req.body.password;
    const password_re = req.body['password-repeat'];
    const email = req.body.email;

    // 校验两次输入的密码是否一致
    if (password !== password_re) {
        req.flash('error', '两次输入的密码不一致!');
        return res.redirect('/reg');
    }

    // 生成密码的md5值
    const md5 = crypto.createHash('md5');
    const hashedPassword = md5.update(password).digest('hex');

    const newUser = new User({
        name: name,
        password: hashedPassword,
        email: email
    });

    // 检查用户名是否已存在
    User.findOne({ name: name }, function (err, user) {
        if (err) {
            req.flash('error', '数据库查询出错');
            return res.redirect('/reg');
        }

        if (user) {
            req.flash('error', '用户已存在');
            return res.redirect('/reg');
        }

        // 如果不存在则是新增用户
        newUser.save(function (err) {
            if (err) {
                req.flash('error', '注册失败,请稍后再试');
                return res.redirect('/reg');
            }

            req.session.user = newUser;
            req.flash('success', '注册成功!');
            return res.redirect('/');
        });
    });
});

关键点解释

  • 中间件body-parser 用于解析请求体中的数据。
  • 异步操作:确保所有数据库操作都通过回调函数正确处理。
  • 错误处理:在每个异步操作后添加错误处理逻辑,以捕获潜在的错误并及时反馈给用户。

希望这些改进能帮助你解决表单提交时遇到的问题。如果还有其他问题,请随时告诉我!


问题不够详细啊,这样叫大家怎么解答

哦,代码略多: https://github.com/nswbmw/N-blog/wiki/第1章–一个简单的博客 数据库用的是mongodb: 2014-06-05T16:04:35.449+0800 [initandlisten] connection accepted from 127.0.0.1: 62375 #3 (3 connections now open) 2014-06-05T16:04:35.452+0800 [initandlisten] connection accepted from 127.0.0.1: 62376 #4 (4 connections now open) 2014-06-05T16:04:35.453+0800 [initandlisten] connection accepted from 127.0.0.1: 62377 #5 (5 connections now open) 2014-06-05T16:09:26.521+0800 [clientcursormon] mem (MB) res:56 virt:468 2014-06-05T16:09:26.523+0800 [clientcursormon] mapped (incl journal view):320 2014-06-05T16:09:26.527+0800 [clientcursormon] connections:5 2014-06-05T16:14:26.620+0800 [clientcursormon] mem (MB) res:56 virt:468 2014-06-05T16:14:26.620+0800 [clientcursormon] mapped (incl journal view):320 2014-06-05T16:14:26.621+0800 [clientcursormon] connections:5 2014-06-05T16:19:26.724+0800 [clientcursormon] mem (MB) res:56 virt:468 2014-06-05T16:19:26.724+0800 [clientcursormon] mapped (incl journal view):320 2014-06-05T16:19:26.725+0800 [clientcursormon] connections:5

已找到原因,谢谢

根据你提供的代码片段,你在处理表单提交时遇到了性能问题,并且最终会失败。以下是一些可能的原因及解决方案:

  1. 异步操作顺序:确保你的异步操作是按顺序执行的。在Node.js中,异步操作需要正确处理回调函数。

  2. 数据库查询效率:确保数据库查询是高效的。如果你使用的是MongoDB或其他数据库,可以考虑索引优化。

  3. 错误处理:确保错误处理逻辑是正确的,以便能够捕获并处理任何潜在的错误。

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

const crypto = require('crypto');
const User = require('./models/User'); // 假设你有一个User模型

app.post('/reg', function(req, res) {
    const name = req.body.name;
    const password = req.body.password;
    const password_re = req.body['password-repeat'];
    const email = req.body.email;

    // 检查两次输入的密码是否一致
    if (password !== password_re) {
        req.flash('error', '两次输入的密码不一致!');
        return res.redirect('/reg'); // 返回注册页
    }

    // 生成密码的md5值
    const md5 = crypto.createHash('md5');
    const hashedPassword = md5.update(password).digest('hex');

    // 检查用户名是否已存在
    User.findOne({ name }, function(err, user) {
        if (err) {
            req.flash('error', '发生错误,请重试。');
            return res.redirect('/reg'); // 返回注册页
        }
        
        if (user) {
            req.flash('error', '用户已存在');
            return res.redirect('/reg'); // 返回注册页
        }

        // 创建新用户
        const newUser = new User({
            name,
            password: hashedPassword,
            email
        });

        // 保存新用户
        newUser.save(function(err) {
            if (err) {
                req.flash('error', '注册失败,请重试。');
                return res.redirect('/reg'); // 返回注册页
            }

            req.session.user = newUser; // 用户信息存入session
            req.flash('success', '注册成功!');
            res.redirect('/'); // 注册成功返回主页
        });
    });
});

关键点解释:

  1. 异步操作顺序:确保所有异步操作都正确地使用了回调函数。
  2. 错误处理:在每个异步操作中添加错误处理逻辑。
  3. 数据库查询:使用findOne方法来查找用户,而不是每次都查找整个集合。

通过这些改进,你可以提高表单提交的性能和稳定性。

回到顶部