Nodejs 实现ajax验证后,点击提交结果显示Not a string or buffer问题

Nodejs 实现ajax验证后,点击提交结果显示Not a string or buffer问题

Connection keep-alive Content-Length 22 Content-Type text/html; charset=utf-8 Date Tue, 18 Dec 2012 10:04:32 GMT X-Powered-By Express 请求头信息原始头信息 Accept text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Encoding gzip, deflate Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Connection keep-alive Cookie connect.sid=s%3AzgCcpo3MXmtsu2GoOnZMNbBJ.V0Mq1w%2FU6TNmfvN5oaVf52n9zrNoYiQ6MciaOj5dbAs Host 127.0.0.1:3000 Referer http://127.0.0.1:3000/login User-Agent Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0 来自上传流的请求头信息 Content-Length 39 Content-Type application/x-www-form-urlencoded 这是firebug下的请求和响应头信息,主要做一个登录功能,前端点击submit,后台没收到用户名和密码,求指导,我还是那个大三的学生,


5 回复

根据你描述的问题,“Nodejs 实现ajax验证后,点击提交结果显示Not a string or buffer问题”,这通常是由于在处理HTTP请求体时,没有正确解析数据导致的。下面我将提供一个简单的示例,展示如何使用expressbody-parser中间件来正确地接收和处理通过AJAX提交的数据。

示例代码

首先确保你已经安装了必要的依赖:

npm install express body-parser

接下来,创建一个简单的服务器文件(例如 server.js):

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

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// 登录路由
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    
    if (!username || !password) {
        return res.status(400).send('用户名或密码不能为空');
    }

    // 这里可以添加你的验证逻辑
    console.log(`登录请求 - 用户名: ${username}, 密码: ${password}`);
    
    // 返回成功响应
    res.send('登录成功');
});

app.listen(3000, () => {
    console.log('服务器运行在 http://localhost:3000');
});

前端代码

这里是一个简单的HTML页面,包含一个表单和一个用于发送AJAX请求的JavaScript函数:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Form</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<form id="loginForm">
    <input type="text" name="username" placeholder="用户名" required>
    <input type="password" name="password" placeholder="密码" required>
    <button type="submit">登录</button>
</form>

<script>
document.getElementById('loginForm').addEventListener('submit', function(event) {
    event.preventDefault();

    const formData = new FormData(this);

    fetch('/login', {
        method: 'POST',
        body: formData,
    })
    .then(response => response.text())
    .then(data => alert(data))
    .catch(error => console.error('Error:', error));
});
</script>
</body>
</html>

解释

  1. 服务器端

    • 使用 body-parser 中间件来解析请求体中的JSON或URL编码数据。
    • /login 路由中,我们从 req.body 获取 usernamepassword 字段。
  2. 客户端

    • 使用原生的 fetch API 发送POST请求到 /login
    • FormData 对象用于收集表单数据,并将其作为请求体发送。

这样设置后,你应该能够正确接收并处理通过AJAX提交的数据,避免出现“Not a string or buffer”的错误。


你得把代码放上来

莫非你在res.write中写了json?这是不被允许的,只能填入字符串或者buffer

exports.login_name=function(req,res){ var username=req.body.txtUsername; db.findUserByName(username,function(err,doc){ if(!err){ if (doc) res.json({“error”:“1”}); else res.json({“error”:“0”}); } }); };这是后台验证,前后台传的数据都是json

根据你提供的信息,问题可能出在请求的数据格式或处理方式上。你的前端代码通过 AJAX 发送了一个 application/x-www-form-urlencoded 类型的请求,而你的 Node.js 后端代码可能没有正确地解析该类型的数据。

示例代码

假设你使用的是 Express 框架,你需要使用 body-parser 中间件来解析请求体数据。以下是一个简单的示例:

前端代码(使用 jQuery 发起 AJAX 请求)

<form id="loginForm">
    <input type="text" name="username" placeholder="Username">
    <input type="password" name="password" placeholder="Password">
    <button type="submit">Login</button>
</form>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    $('#loginForm').on('submit', function(event) {
        event.preventDefault(); // 阻止表单默认提交行为

        var formData = $(this).serialize(); // 序列化表单数据

        $.ajax({
            url: '/login',
            method: 'POST',
            data: formData,
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
            success: function(response) {
                console.log('Login successful:', response);
            },
            error: function(error) {
                console.error('Login failed:', error);
            }
        });
    });
});
</script>

后端代码(使用 Express 和 body-parser)

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

const app = express();

// 使用 body-parser 解析请求体
app.use(bodyParser.urlencoded({ extended: false }));

app.post('/login', (req, res) => {
    const username = req.body.username;
    const password = req.body.password;

    if (!username || !password) {
        return res.status(400).send('Username and password are required.');
    }

    // 在这里处理登录逻辑
    console.log('Username:', username, 'Password:', password);

    res.send('Login successful');
});

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

解释

  1. 前端:使用 jQuery 的 .serialize() 方法将表单数据序列化为 application/x-www-form-urlencoded 格式,并通过 AJAX 发送到 /login 路由。
  2. 后端:使用 body-parser 中间件解析请求体数据。这样可以在 req.body 中获取到 usernamepassword 参数。

确保你的 Node.js 项目中已经安装了 expressbody-parser,可以通过以下命令安装:

npm install express body-parser

希望这能解决你的问题。如果你还有其他疑问,请提供更多的代码细节。

回到顶部