ajax和Nodejs

ajax和Nodejs

我想是想用ajax提交微博的功能,逻辑是这样的: 数据post到nodejs服务端后先检查用户时候登陆,如果没登陆就用 res.render(“login”);

跳转到登陆页面,这个逻辑在用form表单提交时是正常的,但是如果用jQuery的$.ajax函数提交,res.render(“login”);就不会转到登陆页面,而且下面的程序也不执行,对应的ajax代码如下: $.ajax({ type: “POST”, url: “http://127.0.0.1:3000/pub”, data:sendWb, success:function(data) {alert(JSON.stringify(data))}, dataType: “JSON” }); 在nodejs处可以获取到post 来的信息,说明ajax语句没问题,但是为什么就不能跳转呢?是不是form表单提交和ajax的post在连接方面有区别?


4 回复

当然可以。你的问题涉及到前端使用 $.ajax 提交请求与后端 Node.js 处理请求的方式不同。下面我会详细解释这个问题,并提供一些示例代码。

问题分析

当使用 $.ajax 进行异步请求时,浏览器不会自动进行页面重定向(如 res.render("login")),因为 $.ajax 是一个异步请求,它不会刷新整个页面。相反,它会在当前页面中处理返回的数据。

解决方案

你可以通过在客户端判断服务器返回的状态来决定是否需要重定向。例如,如果你在服务器端检测到用户未登录,则返回一个特定的状态码或消息,客户端可以根据这个状态码或消息进行相应的操作。

示例代码

Node.js 服务端代码

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

const app = express();
app.use(bodyParser.json());

app.post('/pub', (req, res) => {
    // 检查用户是否登录
    const isLoggedIn = req.session.isLoggedIn;

    if (!isLoggedIn) {
        return res.status(401).json({ message: '请先登录' });
    }

    // 用户已登录,继续处理微博发布逻辑
    // ...
    res.json({ success: true, message: '微博发布成功' });
});

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

客户端 jQuery 代码

$.ajax({
    type: "POST",
    url: "http://127.0.0.1:3000/pub",
    data: sendWb,
    success: function(response) {
        if (response.message === '请先登录') {
            // 重定向到登录页面
            window.location.href = "/login";
        } else {
            alert(JSON.stringify(response));
        }
    },
    error: function(error) {
        console.error("Error:", error);
    },
    dataType: "JSON"
});

解释

  1. 服务端代码

    • 使用 expressbody-parser 中间件来处理 HTTP 请求。
    • /pub 路径上监听 POST 请求。
    • 检查用户是否已经登录(假设你使用了会话管理)。
    • 如果用户未登录,返回一个 401 状态码和错误消息。
    • 如果用户已登录,继续处理微博发布逻辑并返回成功消息。
  2. 客户端代码

    • 使用 $.ajax 发送 POST 请求。
    • success 回调函数中,检查服务器返回的消息。
    • 如果消息为 "请先登录",则使用 window.location.href 重定向到登录页面。
    • 否则,显示成功消息。

这样,你就可以根据服务器返回的状态码或消息来决定是否需要重定向到登录页面。希望这能解决你的问题!


ajax 是用来传递数据的。客户端需要根据情况,进行跳转:

window.location = url;

情况判断的语句在nodejs中。我还是不太明白你的意思,是不是说用了ajax就不能用用res.render或res,redirect跳转了? window.location = url;这个语句写在什么位置?起什么作用?谢谢。

当使用 $.ajax 提交请求时,它是在当前页面内异步发送请求并处理响应。这意味着 res.render("login") 并不会导致浏览器跳转到新的页面。res.render 只会在服务器端渲染一个模板,并将结果返回给客户端。

示例代码

Node.js 服务端代码

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

app.use(bodyParser.json());

app.post('/pub', (req, res) => {
    const user = req.session.user; // 假设使用session来保存用户登录状态

    if (!user) {
        return res.status(401).json({ message: "未登录" });
    }

    // 处理微博发布逻辑
    // ...

    res.json({ message: "微博已发布" });
});

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

客户端 jQuery AJAX 请求

$.ajax({
    type: 'POST',
    url: 'http://127.0.0.1:3000/pub',
    data: JSON.stringify(sendWb),
    contentType: 'application/json',
    success: function(data) {
        alert(JSON.stringify(data));
    },
    error: function(xhr, status, error) {
        if (xhr.status === 401) {
            window.location.href = '/login'; // 如果未登录,重定向到登录页面
        }
    },
    dataType: 'json'
});

解释

  1. 服务端:在 /pub 路由中,首先检查用户的登录状态。如果用户未登录,则返回一个 401 状态码。
  2. 客户端:在 $.ajaxerror 回调中检查响应状态码。如果是 401(未授权),则使用 window.location.href 重定向到登录页面。

这种方式确保了未登录用户无法发布微博,并且可以正确地跳转到登录页面。

回到顶部