我尝试使用成角度的HttpClient
get
,delete
,post
连接到node.js API,一切都成功。
但是当我使用put
方法连接时,我发现可以连接,但是没有其他反射。
例如:
以角形put
连接/api/edit/:id
import { HttpClient } from "@angular/common/http";
constructor( private http: HttpClient,) { }
editData(data: any, id: any){
this.http.put<any>(this.Url + "/api/edit/" + id, data).subscribe(res =>{
});
}
Node.js put
API /api/edit/:id
:
router.put('/api/edit/:id', (req, res, next) => {
console.log("edit api connected!");
res.status(200).json();
});
正在运行的node.js服务器cmd
窗口显示如下:
OPTIONS /api/edit/5c481dedbe234c2dec23c6a0 200 1.333 ms - 3
但不显示"edit api connected!"
;
我不知道为什么显示OPTIONS
。
其他方法也可能发生这种情况,例如DELETE
,但不影响操作。
我尝试使用postman连接相同的AIP,工作正常,日志如下:
edit api connected!
PUT /api/edit/testid 200 0.635 ms - -
我尝试更改路由器:/api/edit/
(无参数),只是无法工作。
答案 0 :(得分:3)
当您通过Chrome或其他浏览器(使用有角度的httpclient)将请求发送到其他域(来源不同)时,将有两个请求。第一个是OPTION的飞行前请求,用于检查服务器端允许使用哪些方法(GET,PUT,POST等)。一个OPTION请求期望带有CORS标头的响应:
示例:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept, authorization, content-type, x-requested-with, user-id
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 1
Allow: HEAD, GET, OPTIONS
此请求失败时,浏览器不会发送您实际的请求PUT
。有了邮递员,没有飞行前的选项,这就是它起作用的原因。
要使您的node.js服务器与angular一起使用,您必须使用cors中间件,例如:
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
此处有更多信息:https://expressjs.com/en/resources/middleware/cors.html