mongoose Angular 2:在preflight响应中,Access-Control-Allow-Methods不允许方法DELETE

vptzau2j  于 2023-04-12  发布在  Go
关注(0)|答案(2)|浏览(133)

我需要使用mongoose删除mongodb上的一条记录。
这是我的元件

deleteProduct(product){
        this._confirmationService.confirm({
            message: 'Are you sure you want to delete the item?',
            accept: () => {
                this._productsAdminService.deleteProduct(product._id)
                    .subscribe(products => {
                        products.forEach(function(product){
                            if(product.cat_id === 1) product.catName = 'Dota Shirts';
                            if(product.cat_id === 2) product.catName = 'Gym Shirts';
                            if(product.cat_id === 3) product.catName = 'Car Shirts';
                        });
                        this.products = products;
                    },
                    err => console.log(err));
            }
        })
    }

基本上,这将仅将产品ID传递给服务以执行HTTP请求。
这是我的服务

deleteProduct(productId){
    let headers = new Headers({'Authorization': 'JWT ' + localStorage.getItem('currentUserToken')});
    let options = new RequestOptions({ headers: headers});
    return this._http.delete('http://localhost:3000/admin/products/delete/' + productId, options)
        .map((response: Response) => response.json())
        .catch(this._handlerError);
}

我在expressJS中使用delete方法调用我的API。
这是我的API

productsAdminRouter.route('/delete/:productId')
    .delete(function(req,res){
        id = req.params.productId;
        console.log(id);
        Products.findByIdAndRemove(id)
            .exec(function(err, done){
                if (err) throw err;
                Products.find()
                    .exec(function(err, products){
                        res.json(products);
                    });
            });
    });

但我总是得到这个错误

有人能帮忙吗?我卡住了。

ukdjmx9f

ukdjmx9f1#

正如@flashjpr所说
我必须为我的实体“ticket”编写一个特定的中间件。

var allowDelete = function(req, res, next){
  res.append('Access-Control-Allow-Methods', 'DELETE')
  next()
}

并将其传递给该实体的第一中间件

app.use('/tickets', allowDelete, tickets);

**编辑:**我使用的是expressjs

nfs0ujit

nfs0ujit2#

前几天我在使用Java-Spring后端时遇到了同样的问题:当跨域资源共享(或简称cors)发生时,Angular会在实际的OPTIONS(http)请求(* 这里是DELETE*)之前发送一个pre-flight请求。
你要做的是:

  • 在服务器上启用CORS
  • 确保您的服务器在该特定端点(/delete/:productId)上接受OPTIONS请求
  • Access-Control-Allow-Methods标头添加到OPTIONS的响应DELETE

相关问题