2017-04-01 38 views
0

我試圖找出Node.js作爲api做GET,POST等我一直在試圖弄清楚爲什麼這篇文章不工作。ExpressJS似乎並沒有與阿賈克斯調用

我的Ajax調用:

$.ajax({ 
     method: "POST", 
     contentType: 'application/json', 
     dataType: 'json', 
     url: "localhost:8000/login", 
     data: JSON.stringify({user:"john", pass:"123"}), 
     error: function() { 
      alert('error'); 
     }, 
     success: function (data) { 
      alert('success'); 
     } 
    }); 

在我的快遞:

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

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 

app.post('/login', function (req, res) { 
    var user = req.body.user; 
    var password = req.body.pass; 
    if(user == 'john' && password == '123') { 
    res.status(200); 
    } else { 
    res.status(401); 
    } 
}); 

app.listen(8000, function() { 
    console.log('Example app listening on port 8000!'); 
}); 

任何幫助是極大的讚賞。

+0

你得到的錯誤是什麼? – abdulbarik

+0

我總是收到'錯誤'警報,意味着ajax調用不成功。它應該是。 –

+0

您的服務器正在運行?和你的代碼前端運行在同一臺服務器上? – abdulbarik

回答

1

您應該返回從您的快件代碼的一些反應,也應對應特別是在剛剛發送只喜歡res.status(401);

app.post('/login', function (req, res) { 
    var user = req.body.user; 
    var password = req.body.pass; 
    if(user == 'john' && password == '123') { 
     res.status(200).json({t:1}); 
    } else { 
     res.status(401); 
    } 

    res.end(); 
}); 
+0

值得指出status()不這樣做,但sendStatus()和其他方法。 – Paul

+0

這沒有錯,它只是不完整。但他確實解釋了他的建議和原因。 – Paul

1

這項工作的狀態代碼,我的情況下結束:

$.ajax({ 
     type: "POST", 
     contentType: 'application/json', 
     dataType: 'json', 
     url: "/login", 
     data: JSON.stringify({user:"john", pass:"123"}), 
     error: function (err) { 
      console.log(err); 
      alert('error'); 
     }, 
     success: function (data) { 
      alert('success'); 
     } 
    }); 
    app.post('/login', function (req, res, next) { 
    var user = req.body.user; 
    var password = req.body.pass; 
    if(user == 'john' && password == '123') { 
    res.status(200).json({s: 1}); 
    } else { 
    res.status(401).json({e: 2}); 
    } 
    }); 
+0

這是一條評論,而不是答案。 – Paul

+0

因爲你沒有真正回答這個問題,也沒有解釋OP做錯了什麼。你只是斷言你的Ajax調用起作用。此外,它沒有解決其他答案所做的服務器代碼也是錯誤的。 – Paul

+0

@保羅,我很抱歉! – MWY

-1

我認爲你必須解析請求到JSON。
你的代碼是: -

$.ajax({ 
     method: "POST", 
     contentType: 'application/json', 
     dataType: 'json', 
     url: "localhost:8000/login", 

     //here you used JSON.stringify and on server side you have to parse it to use 'user' and 'pass' as a key of json 

     data: JSON.stringify({user:"john", pass:"123"}), 
     error: function() { 
      alert('error'); 
     }, 
     success: function (data) { 
      alert('success'); 
     } 
    }); 

在服務器端

<br> 
app.post('/login', function (req, res) { 

//parse data to JSON for further use 
    var dataObj = JSON.parse(req.body.data); 
    if(dataObj.user == 'john' && dataObj.password == '123') { 
    res.status(200); 
    } else { 
    res.status(401); 
    } 
}); 

+0

您的服務器端邏輯實際上不會完成響應,客戶端將超時。 – Paul

+1

使用res.send()函數,它將您的數據返回到ajax成功函數 –

0
var json = JSON.stringify({user:"john", pass:"123"}); 

$.ajax({ 
    dataType: 'json', 
    type: "POST", 
    url: "/login", 
    data: json 
}).done(function(data){ 
    console.log("works fine"); 
}); 

應該一個Ajax功能後工作,將數據發送到節點服務器。 該url需要與節點服務器文件中的app.post的url相匹配,您不需要在它前面使用localhost。 ContentType也不是必需的,我在Ajax調用之外創建json對象,而不是在Ajax調用中設置它。

var express = require('express'); 
var parser = require('body-parser'); 

var app = express(); 

var port = 8000; 

app.use(parser.urlencoded({extended: false})); 
app.use(parser.json()); 
app.use(express.static('public')); 

app.post('/login', function (req, res) { 
    var user = req.body.user; 
    var password = req.body.pass; 

    if(user == "john" && password == "123") { 
     res.status(200); 
    } else { 
     res.status(401); 
    } 
}); 

var server = app.listen(port, function() { 
    var host = server.address().address 
    var port = server.address().port 

    console.log("App listening at http://%s:%s", host, port); 
}); 

而且這應該適用於節點服務器本身。 我將服務器設置爲運行狀態,因此您可以始終跟蹤它正在監聽的端口,因此您無需爲了更改端口而煩心地滾動,只需更改文件頂部的端口即可。 此外,/login對我來說看起來很好。 另外,我編輯了app.use語句並添加了一個。