Angular 2 + NodeJS + Mongoose - 从 Angular 2 发布数据到 rest api nodejs 后端。节点 api 日志:选项 /url,POST 标头不起作用

Posted

技术标签:

【中文标题】Angular 2 + NodeJS + Mongoose - 从 Angular 2 发布数据到 rest api nodejs 后端。节点 api 日志:选项 /url,POST 标头不起作用【英文标题】:Angular 2 + NodeJS + Mongoose - post data from angular 2 to rest api nodejs backend. Node api logs: OPTION /url, POST headers doesnt work 【发布时间】:2017-02-17 22:10:09 【问题描述】:

我在将数据从 angular2 前端 api 发布到后端客户端时遇到问题 - nodeJS + mongoose。 在 Angular2 客户端上,我使用要发送的数据制作 console.log,并且服务显示正确的值。

在 NodeJS 后端我也尝试 console.log 发布数据,但我没有定义。请查看下面的代码,并尝试找出我做错了什么。我也尝试过使用Promise<>Observable<>,效果相同。

PS。通过 Angular 2 从 NodeJS api 获取数据运行良好。

PS2。重要的事实,问题存在,因为 angular2 不会在 post 或 put 中创建标题。每次,当我发出 POST Req 时,NODE Server 都会记录OPTION /login。那是什么意思?

Angular2:

signIn(data: Object): Observable<User> 
    let bodyString = JSON.stringify(data);

    let headers = new Headers(
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
    );
    let options = new RequestOptions( headers: headers );

    console.log("data: ", data, "\nbodyString: ", bodyString, "\nHeaders: ", headers, "\nOptions: ");

    return this.http
        .post( this.signInUrl, bodyString, headers: headers)
        .map( (res:Response) => res.json() )
        .catch((error:any) => Observable.throw(error.json().error || 'Server error'));


NodeJS:

[...]
// configure app
app.use(morgan('dev'));

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

var mongoose    = require('mongoose');

var Test        = require('./model/test');
var User        = require('./model/user.schema');

mongoose.connect('mongodb://localhost:27017/lounge');

app.set('secret', config.secret);

app.get('/', function(req, res) 
    res.json( message: 'hooray! welcome to our api!' );
);    
app.post('/login', function (req, res) 
        console.log("Recived login request!", req.body);
    );
[...]

【问题讨论】:

它应该可以正常工作。你能把扩展值设为假吗? extended: false 感谢您的评论,我应该在哪里传递值扩展:false? 在这一行 app.use(bodyParser.urlencoded( extended: true ));设置为假 我改变了这个,但没有结果。当我从“POSTMAN”发出 POST 请求时,一切正常,节点服务器正确显示 req.body。 你成功了吗?我遇到了类似的问题 【参考方案1】:

我认为您的问题是您如何通过不使用您创建的 RequestOptions 对象来发出发布请求。

signIn(data: Object): Observable<User> 
let bodyString = JSON.stringify(data);

let headers = new Headers(
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*'
);
let options = new RequestOptions( headers: headers );

console.log("data: ", data, "\nbodyString: ", bodyString, "\nHeaders: ", headers, "\nOptions: ");

return this.http
    .post( this.signInUrl, bodyString, options) // **Change happens here
    .map( (res:Response) => res.json() )
    .catch((error:any) => Observable.throw(error.json().error || 'Server error'));


唯一的变化是使用您声明的选项(RequestOptions),而不是尝试在 post 方法中定义“ headers: headers ”。

这是我第一次发帖。我希望这会有所帮助,并且此帖子正确。

【讨论】:

【参考方案2】:

我认为问题在于 nodejs 和 angular cominication。因为它们在不同的端口上工作,所以它们无法通信。因此,您应该将此代码作为中间件添加到 nodejs 中,并且我建议您搜索“cors express”和“cors npm package”。我希望这能解决你的问题。

app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
);

【讨论】:

以上是关于Angular 2 + NodeJS + Mongoose - 从 Angular 2 发布数据到 rest api nodejs 后端。节点 api 日志:选项 /url,POST 标头不起作用的主要内容,如果未能解决你的问题,请参考以下文章

nodejs中没有'dist'的Angular 2

Angular 2 + NodeJS + Mongoose - 从 Angular 2 发布数据到 rest api nodejs 后端。节点 api 日志:选项 /url,POST 标头不起作用

Angular 2 Universal 中的身份验证,nodejs

使用 Angular 2 服务、mongoDB 和 NodeJs 编辑对象

angular2-webpack-starter 如何将 NodeJS 服务器添加到项目中

Angular 2/Nodejs 部署到 heroku 错误 heroku-postbuild: `ng build`