2016-02-27 104 views
0

我只是围绕一个奇怪的错误工作。我使用有效的json和应用程序/ json头文件发送REST PUT调用。什么会阻止sailsjs识别req.params?

在PUT调用的JSON是

{ 
    "gravatarURL":  "http://www.gravatar.com/avatar/?d=mm" 
} 

为什么有效的JSON任何想法不req.params被认可?

处理该替代方法的代码解析JSON身体进入params为

updateProfile: function(req, res) { 

    tag = 'UserController.updateProfile' ; 

    user = {} ; 
    user.id = req.session.userId ; 
    if (!user.id){ 
     user.id = 0 ; 
    } 

    /* the following line of code should result in params with elements */ 
    params = req.params ; 
    /* what I get is params == [] */ 

    /* this is the start of the workaround */ 
    if (params.length == 0) { 
     try { 
      /* copying the body creates a valid json object */ 
      params = {} 
      params.body = req.body ; 
      params = params.body ; 
      /* gravatarURL is the parameter sent in via the REST PUT call */ 
      user.gravatarURL = params.gravatarURL ; 
     } catch (e){ 
      /* ignore and pass through to error with no params */ 
      console.log(tag + '.error: ' + e.message) ; 
     } 
    } else { 
     /* this is what I expect to be able to do */ 
     user.gravatarURL = req.param['gravatarURL'] ; 
    } 

    if (user.id && user.gravatarURL) { 
     console.log(tag + '.update.start') ; 
     User.update({ id: user.id }, { gravatarURL: user.gravatarURL }, function(error, updatedUser) { 
      if (error) { 
       console.log(tag + '.update.error: ' + error.message) ; 
       return res.negotiate(error); 
      } else { 
       console.log(tag + '.update.finish: ') ; 
       return res.json(updatedUser); 
      } 
     });  
    } else { 
     if (!user.id) { 
      error = {} ; 
      error.message = 'authorisation required. please login.' ; 
      return res.badRequest({error:error}) ; 
     } 
     if (!user.gravatarURL) { 
      error = {} ; 
      error.message = 'gravatarURL: required' ; 
      return res.badRequest({error:error}) ; 
     } 
    } 

} , 
+0

你能至少标志着它没有在工作线或给予错误或什么? – Datsik

+0

@Datsik完成。真奇怪的部分是我有其他代码...在同一个模块中... ...按预期工作。 put的调用是一个邮递员是一个相似的代码复制到相同的模块工作。 –

+0

您是否尝试过['req.allParams()'](http://sailsjs.org/documentation/reference/request-req/req-all-params)?根据[文档](http://sailsjs.org/documentation/reference/request-req/req-params),'req.params'是“含有从URL路径解析参数值的对象。”所以它应该只包含url参数。如果您在请求正文中发送内容,它们将不会包含在'req.params'中。 – Fissio

回答

1

取决于你如何拨打电话,将取决于其中的参数显示请求对象(REQ)上。

由于要发送与应用程序/ JSON头JSON对象,该对象被添加到req.body。具有URL路径的请求将被添加到req.params。根据documentation req.params是一个包含从URL路径解析的参数值的对象。例如,如果您有route/user /:name,则URL路径中的“name”将作为req.params.name提供。该对象默认为{}。'

所以如果你想通过req.params访问参数,你可以改变你的请求到'/updateProfile?gravatarURL=www.someurl.com,否则如果你传递一个JSON对象,它将在req.body中可用。所以你的解决方法是多余的,因为按设计你想访问的内容已经在req.body中安全了。

该文档不做解释这个的最好的工作,但有一点试验和错误很容易找出你传递的值都呈现请求对象了。

相关问题