我使用Node.js准备了我的服务器(使用Chrome Postman测试,一切正常)。它安装在Ubuntu 16.04 Server虚拟机中,我可以测试主机(win7)中的所有内容。然后我在我的虚拟机上添加了Ionic2框架并开始了前端的开发,但是我在发送请求POST时遇到了问题。
我使用以下代码创建了一个provaider:
import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class MyProvider1 {
data: any;
constructor(public http: Http) {
this.data = null;
}
login(id,pwd){
let headers = new Headers();
headers.append('Content-Type', 'application/json');
this.http.post('http://localhost:8080/',
JSON.stringify({
username: id ,
password: pwd
}), {headers: headers})
.subscribe(res => {
console.log(res.json());
});
}
}
应该可以正常工作但是当调用login函数时,我的node.js服务器会记录一个奇怪的请求:
OPTION / 200 0.348 ms -13
而不是POST
请求。此外,在我的主机chrome浏览器中,控制台显示以下故障:
XMLHttpRequest无法加载http://localhost:8080/。回应 预检请求未通过访问控制检查:否 '访问控制允许来源'标题出现在请求的上 资源。起源' http://localhost:8100'因此是不允许的 访问。
只是为了试用,我删除了{headers: headers}
,http.post
成了:
this.http.post('http://localhost:8080/',
JSON.stringify({
username: id ,
password: pwd
}))
.subscribe(res => {
console.log(res.json());
});
通过这种方式,Morgan在我的Node.js中登录POST
请求但是req.body是空的(如果我console.log(req.body)
输出将是{}
)。
以防万一,我在我的服务器Node.js代码的以下部分发布:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var morgan = require('morgan');
var mongoose = require('mongoose');
//------------------------------------
//Configuration
//------------------------------------
var config = require('./config.js');
var port = process.env.PORT || config.SERVICE_PORT;
app.use(morgan('dev'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//------------------------------------
//Routes
//------------------------------------
app.use('/admin', require('./app/routes/admin.js'));
app.use('/', require('./app/routes/guest.js'));
app.use('/chat', require('./app/routes/chat.js'));
//------------------------------------
//Server Start
//------------------------------------
mongoose.connect(config.database);
app.listen(port);
console.log('server start at port ' + port);
我的/app/routes/guest.js包含以下代码:
...
router.route('/')
.get(function(req,res){
res.end('Welcome');
})
.post(function(req,res){
UsersManager.login(req.body.username,req.body.password,function(err,user){
if(err) throw err;
if(!user){
res.json({
success: false,
message: Const.notificationTokenAccessNOK
});
}else{
var token = TokenManager.createToken(user);
res.json({
success: true,
message: Const.notificationTokenAccessOK,
token: token
});
}
});
});
module.exports = router;
答案 0 :(得分:1)
在chrome浏览器中测试时,您无法从ionic2代码执行网络请求(至少不是直接)。
但是如果你愿意,你可以将代理放在ionic.config.json
文件中,如下所示:
{
"proxies": [{
"path": "/localhost/",
"proxyUrl": "http://localhost:8080/"
}]
}
然后您可以执行后续请求:
this.http.post('/localhost/',
JSON.stringify({
username: id ,
password: pwd
}))
.subscribe(res => {
console.log(res.json());
});