我已经按照Can feathers co exist with routs managed out side of feathers配置了服务器/节点。我的配置如下所示。
const app = express(feathers());
app.use(cookieParser());
app.use(csrf({cookie: true}));
app.use(express.urlencoded({extended: true}));
app.use(express.json({strict: false, limit: '1mb'}));
app.configure(express.rest());
app.configure(primus({transformer: 'uws'}, primus => {
// primus.library();
// primus.save(__dirname + '/feathers-primus-client.js');
primus.authorize(function (req, done) {
const userToken = socketUtility.getTokenFromHandshake(req);
if (csrf.verifyCSRFToken(req)) { // csrfToken === req.query.csrf;
done();
} else {
done({statusCode: 403, message: 'handshake unauthorized'});
}
});
// Set up our services (see `services/index.js`)
app.configure(services);
app.hooks(appHooks);
这是我的客户代码的一部分:
this.restFeathersClient = feathers();
this.socketFeathersClient = feathers();
this.serverAddress = `${window.location.origin}:${window.location.port}`;
const rest = feathers.rest(this.serverAddress);
this.restFeathersClient.configure(rest.fetch(window.fetch));
const socket = new Primus(this.serverAddress);
this.socketFeathersClient.configure(feathers.primus(socket));
现有应用程序使用的是csrf软件包。因此,无需过多介绍。从客户端,我需要:
对于Primus,我们当前的实现监听“ outgoing :: url”。
我非常感谢您的帮助,因为我不确定如何使用Feathers Client执行此操作。
答案 0 :(得分:0)
因此,我能够找到REST调用的解决方案。我打算使用提取,因此我的解决方案仅适用于提取。我使用了“ fetch-intercept”包,并注册了一个拦截器来添加标题。如果您使用angularjs,则可能可以使用$ http并添加标头。对于其他REST选项,您可能必须找到类似的解决方案。
这是代码段:
import * as fetchIntercept from 'fetch-intercept';
fetchIntercept.register({
request(url, config) {
if (config.method !== 'GET') {
const XSRF_TOKEN = 'XSRF-TOKEN';
const csrfToken = document.cookie.match(new RegExp('(^| )' + XSRF_TOKEN + '=([^;]+)'));
if (csrfToken) {
config.headers[`X-${XSRF_TOKEN}`] = csrfToken[2];
}
}
return [url, config];
}
});
这是Primus的解决方案:
const csrfToken = 'get your token';
const socket = new Primus(`${this.serverAddress}?csrf=${csrfToken}`);
feathersClient.configure(feathers.primus(socket));