[Hỏi] Cách trả dữ liệu về ajax trong method POST



  • Hi mọi người,
    Em mới học NodeJS , làm form login nhưng gặp vấn đề mong mọi người giúp đỡ với ạ.
    Cụ thể như sau:
    Em có button Login, khi click vào sẽ hiện ra modal login(dùng bootstrap).
    Sau khi điền thông tin ở form login thì em gọi tới 1 function dùng ajax để post lên.
    Nhưng sau đó server trả về thì kết quả không vào success hoặc error.(Mục đích là sẽ thông báo lỗi(nếu có) ngay ở trên modal)
    Vậy nó bị gì thể ạ?



  • Có thể là bạn k set timeout cho Ajax nên nó chưa báo lỗi, bạn thử post code liên quan lên xem mọi người có giúp được gì k.



  • Code bên javascript của mình:
    $('btn-login').click(function() {

    $.ajax({
    
        type: 'POST',
    
        url: location.protocol + '//' + location.host + '/login',
    
        success: function(data) {
    
            console.log(data);
    
        },
    
        error: function(xhr, status, err) {
    
            console.log(err);
    
        }
    
    });
    

    });

    // Phía server

    app.get('/', function(req, res) {

    res.render('index.ejs', {
    
        message: req.flash('message')
    
    });
    

    });

    app.post('/login', passport.authenticate('local-login', {

        failureRedirect: '/',
    
        failureFlash: true
    
    }),
    
    function(req, res) {
    
        res.redirect('/home');
    
    });
    

    // Pastport

    passport.use('local-login', new LocalStrategy({

        usernameField: 'email',
    
        passwordField: 'password',
    
        passReqToCallback: true
    
    },
    
    function(req, email, password, callback) {
    
        User.findOne({ 'local.email': email }, function(err, user) {
    
            if (err)
                return callback(err);
            if (!user)
                return callback(null, false, req.flash('message', "not available user"));
            console.log(user);
            if (!user.verifyPassword(password)) {
                return callback(null, false, req.flash('message', "not correct password"));
            }
            req.session.user = user;
            return callback(null, user);
        });
    }));


  • mình ko thấy trong đoạn ajax data mà bạn gửi đi ?



  • Bạn check lại code nhé

    1. Hàm ajax request đến API login không thấy có data gửi lên .
    2. Trong API login bạn sử dụng res.redirect() - có nghĩa server chỉ trả về Header 301 Redirect đến trang chỉ định mà sẽ không trả về data. Bạn có thể sử dụng res.json() hoặc res.send() .


  • cảm ơn Đức Trần và way.code nha.
    Mình chưa cách POST dữ liệu trong form như thế nào cả.
    Cách truyền thống <form method='POST' action='/login'> thì mình làm được, còn thông qua ajax thì mình còn gặp rắc rối tí ạ



  • $('btn-login').click(function() {
    var username = $('#txt_username').val();
    var password = $('#txt_password').val();
    login(username, password);
    });

    login = function(username, password) {
    $.ajax({
    type: 'POST',
    data: { user: username, pass: password},
    dataType: 'json',
    url: location.protocol + '//' + location.host + '/login',
    success: function(data) {
    console.log(data);
    },
    error: function(xhr, status, err) {
    console.log(err);
    }
    });
    }

    bạn có thể tham khảo, mình modify lại từ code của bạn, trong routes bạn chỉ việc gọi req.body.user và req.body.pass để lấy thông tin user vừa nhập thôi



  • @Đức-Trần cảm ơn anh nhiều nha. Mong được anh giúp đỡ :D



  • @viettienbk

    Nói thêm một chút về POST nha,

    Method POST có 2 loại chính nha bạn

    http://stackoverflow.com/questions/8604717/json-vs-form-post

    JSON và Form.

    • Form thì dùng cho data dạng đơn giản toàn key-value ( ví dụ logform, userform đơn giản )
    • JSON thì dùng cho data dạng phức tạp hơn ( ví dụ 1 người dùng có 1 list địa chỉ, và mỗi địa chỉ là một list các key-value)

    Cách cơ bản và người dùng bên PHP code đầu tiên, đó là Form.

    Nếu bạn dùng Ajax, thì mặc định là 'application/x-www-form-urlencoded; charset=UTF-8' nên bạn phải ghi dataType:'json'.

    Và trên server phải hỗ trợ nữa.

    Chính vì vậy người ta có BodyParser

    https://github.com/expressjs/body-parser



  • đúng rồi, như bạn @Duc-Nguyen108 nói, trên server phải xài BodyParser mới dùng req.body dc nha, mình quên nhắc bạn, sơ sót quá ^^



  • @Duc-Nguyen108 thank bạn nha.
    Nhưng với POST ajax thì khi redirect sang trang khác không được bạn, nó trả về code của trang đó dạng text.
    Ví dụ với login thành công thì chuyển sang trang home chẳng hạn.



  • @Đức-Trần mình có xài BodyParse nên không có lỗi :)



  • @viettienbk chỗ
    success: function(data) {
    // add code
    window.location.reload('/home');
    }

    là được :D


Log in to reply