2017-02-14 68 views
0

我需要使用貓鼬在我的mongodb上刪除記錄。Angular 2:方法DELETE不允許通過預檢響應中的Access-Control-Allow-Methods

這裏是我的組件

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 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); 
        }); 
      }); 
    }); 

但我總是得到這個錯誤

enter image description here

誰能幫助?我卡住了。

回答

0

我用Java的春天后端工作時有同樣的問題在一天:當跨域資源共享(或簡稱cors)正在發生的事情,角發送pre-flight請求前的實際(這裏DELETE )類型爲OPTIONS(http)的請求。

,你所要做的是:

  • 在服務器上啓用CORS
  • 確保服務器可以接受一些選項對特定端點請求(/delete/:productId
  • Access-Control-Allow-Methods頭添加到響應在選項中,刪除
+0

你能教我如何以及在哪裏把我的代碼訪問控制允許方法頭?我現在有授權標題,我不知道如何設置訪問控制。順便說一下,我已經啓用了cors –

+0

嘗試 res.header(「訪問控制允許標題」,「授權,起源,X請求,與內容類型,接受」); (「Access-Control-Allow-Methods」,「PATCH,POST,GET,PUT,DELETE,OPTIONS」); ('OPTIONS'=== req.method){ return res.send(200); } – flashjpr

0

酷似@flashjpr說

我必須寫一個特定的中間件到我的實體「門票」。

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

,並把它傳遞給實體的第一中間件

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

編輯:我用expressjs

相關問題