Rest 允许的动词配置

Rest 允许的动词配置,rest,feathersjs,Rest,Feathersjs,我是feathersjs(v2.0)的新手,刚刚开发了一个小小的REST应用程序,它只使用feathers查找了少数记录。但是,我不知道,也没有找到一种方法,阅读文档和示例,只允许查找而不允许获取、放置、删除等。有没有一种方法可以配置REST API中允许哪些谓词?。我试图在before钩子(在服务钩子中)中添加一个拒绝函数,该函数只有一个返回,但返回了一个500错误,响应为: {“名称”:“GeneralError”,“消息”:“无法读取 未定义,“代码”:500,“类名”:“一般错误”,“数

我是feathersjs(v2.0)的新手,刚刚开发了一个小小的REST应用程序,它只使用feathers查找了少数记录。但是,我不知道,也没有找到一种方法,阅读文档和示例,只允许查找而不允许获取、放置、删除等。有没有一种方法可以配置REST API中允许哪些谓词?。我试图在before钩子(在服务钩子中)中添加一个拒绝函数,该函数只有一个返回,但返回了一个500错误,响应为:

{“名称”:“GeneralError”,“消息”:“无法读取 未定义,“代码”:500,“类名”:“一般错误”,“数据”:{},“错误”:{}

其他谓词的默认值(钩子文件中没有任何函数)为:

“名称”:“未找到”,“消息”:“未找到id的记录” 'null',“代码”:404,“类名”:“未找到”,“错误”:{}

这是有道理的,但我个人的感觉是,如果你不需要这些动词,为什么我需要允许它们并返回这个“误导性”错误

更新:

我做到了,但我不满意,因为响应标题与实际发生的不匹配

为了获取标题信息,我必须在服务文件中添加此代码

// This must be before the service creation
app.use(function(req, res, next) {
    req.feathers.headers = req.headers;
    next();
});

app.use('/myservice', createService(options));
根据给出的答案。但是,函数位于服务创建参数上的daffl给出的答案对使用feathers cli生成的代码不起作用,因此它必须在之前(有更好的方法吗?如何在createService函数中设置为第二个或第一个参数?或者在options对象中,是否可能?我只是得到编译错误)。我必须用hook函数定义一个新文件,并将其包含在“myservice.hooks.js”中

这当然会给出一个500错误,但应该是405错误,并且“GET”上的Allow头。我还尝试使用此代码,而不是抛出一个错误:

hook.params.headers.allow = 'GET';
hook.params.headers.status = 405;
它工作得更好,但在delete上,它会尝试删除数据库中的记录(幸运的是,数据库用户只有select权限),但在POST中,这不应该走得太远,也不会出现类似的行为。只是响应头的状态不是200 OK,而是400(?!!),并且allow头没有改变,所以它是“GET、POST、PUT、PATCH、DELETE”

我读过,但我不知道如何使用feathers的hook.params.headers(或hook.header,但未定义)正确设置header的值,以返回更合适的header响应,当然不再继续。有什么想法吗?请发发慈悲吧,我只是一个有羽毛的初学者(不到一周),也许这是一个愚蠢/明显的问题


提前感谢。

要抛出正确的错误代码,您必须使用中概述的
消除错误。通过使用
方法notallowed
错误并将钩子更改为:

const errors = require('feathers-errors');

module.exports = function () {
  return function (hook) {
    if(hook.method !== 'find' && hook.method !== 'error'){
      throw new errors.MethodNotAllowed('Method not allowed');
    }else{
      return hook;
    }
  };
};

另外,不要忘记将快速错误句柄设置为

谢谢Daff,很抱歉,我没有收到您的快速错误句柄说明。我把代码放在“module.exports=app;”(app.js)和“app.hooks(appHooks);”之前,运气不好,当我启动应用程序时,这个错误显示为:“抛出新类型错误('app.use()需要中间件函数');”。然而,在中间件/index.js文件中的框架代码中,在最后已经有了Express错误句柄,因此它已经在那里了。所以,基本上我不知道该把这段代码放在哪里,我认为是这样的:“app.use(errorHandler());”以及app.js中相应的require。最后我发现,我有另一行错误地粘贴在钩子中,重新定义了另一个const notFound。。。。我还意识到中间件已经有了处理程序,因此不需要设置快速错误处理程序代码。请将答案标记为已接受,或者编写一个答案并标记它。谢谢!:)
const errors = require('feathers-errors');

module.exports = function () {
  return function (hook) {
    if(hook.method !== 'find' && hook.method !== 'error'){
      throw new errors.MethodNotAllowed('Method not allowed');
    }else{
      return hook;
    }
  };
};