Ionic2:POST请求无效

时间:2017-02-05 18:08:58

标签: node.js post ionic2

我使用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;

1 个答案:

答案 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());
                    });