如何在nodejs中对多个函数进行分组和导出?
我试图在 utils.js 中对我所有的 util 函数进行分组:
async function example1 () {
return 'example 1'
}
async function example2 () {
return 'example 2'
}
module.exports = { example1, example2 }
Run Code Online (Sandbox Code Playgroud)
然后在 home.js 中导入:
import { example1, example2 } from '../utils'
router.get('/', async(ctx, next) => {
console.log(example1()) // Promise { 'example 1' }
})
Run Code Online (Sandbox Code Playgroud)
我以为我会得到'example 1'上面的测试用例?
有任何想法吗?
export async function getPlaces(ctx, next) {
const { error, data } = await PlaceModel.getPlaces(ctx.query);
console.log(error, data);
if (error) {
return ctx.throw(422, error);
}
ctx.body = data;
}
Run Code Online (Sandbox Code Playgroud)
Koa 每次都会发送 404 状态和空正文,我做错了什么?
我想将诸如view和 之类的方法添加json到传递给我的控制器的上下文对象中。我在一个先于其他一切运行的中间件中执行此操作:
async function(ctx, next){
ctx.view = view.bind(ctx);
ctx.json = json.bind(ctx);
await next()
ctx.renderer.render();
}
Run Code Online (Sandbox Code Playgroud)
这些方法设置中间件解释的一些常规配置对象(渲染器),然后通过设置正确的ctx.body. 这使我能够轻松切换模板语言,并更轻松地组合 API 和模板请求。
但它不起作用,因为后面await next()是ctx.renderer默认值,而不是控制器设置的值。我怀疑这是一个命名空间问题,但我不确定它来自哪里。
将函数附加到可以引用上下文而不将其传递给它们的上下文的最佳实践是什么?
是否有任何原因导致每个请求两次执行Koa ?
const Koa = require('koa')
const app = new Koa()
const index = async(ctx, next) => {
console.log('Hello world!')
await next()
ctx.body = 'Hello world!'
}
app.use(index);
app.listen(3000)
Run Code Online (Sandbox Code Playgroud)
在我的终端上,我得到:
Hello world!
Hello world!
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这就是我在想的伪代码。
const myRedirect = (routePath) => {
newUrl = routePath;
if (matches condition)
newUrl = do_some_modification(routePath);
return next(newUrl);
}
const myFunc = (routePath, myRedirect) => (newUrl, middleware) => {
return (ctx, newUrl, next) => {
return middleware(ctx, newUrl, next);
}
};
Run Code Online (Sandbox Code Playgroud)
如何对其进行修改以使其正常工作?
我已经使用axios.delete()在前端删除了代码,如下所示
Axios({
method: 'DELETE',
url:'http://localhost:3001/delete',
params: {
id:id,
category:category
}
})
Run Code Online (Sandbox Code Playgroud)
而且我使用koa-router在后端解析我的请求,但是我无法获取查询参数。
const deleteOneComment = (ctx,next) =>{
let deleteItem = ctx.params;
let id = deleteItem.id;
let category = deleteItem.category;
console.log(ctx.params);
try {
db.collection(category+'mds').deleteOne( { "_id" : ObjectId(id) } );
}
route.delete('/delete',deleteOneComment)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
这是问题的背景:我正在使用Koa 2跟踪开球 koa。但是开场练习中的练习是为 Koa 1 设计的。我为 Koa 2 的这个问题创建了一个问题: Koa 2错误处理程序的任务无法通过。
简而言之,我的问题是如何在发生 500 错误时显示自定义错误页面。
以下是代码:
// error handler middleware
function errorHandler(ctx, next) {
try {
return next();
}
catch(err) {
ctx.status = err.status || 500;
// I would like to display the custom message as follows
ctx.body = 'Oops! internal server error';
// with emitting the error event, don't work
// ctx.app.emit('error', err, ctx);
}
}
// to generate error
app.use(router.get('/error', ctx => { …Run Code Online (Sandbox Code Playgroud) 问题
我正在尝试使用koa2运行简单的 http 服务器,但在运行时遇到问题。
它使用es6预计将在未来的node.js版本中工作,我想知道如何运行它node v6.1.0?
代码
import Koa from 'koa';
const app = new Koa();
// Setup handler.
app.use(async ctx => {
ctx.body = "Hello World!";
});
// Start server.
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
输出
$ node --version
v6.1.0
$ node --harmony index.js
C:\Users\gevor\WebstormProjects\untitled1\index.js:1
(function (exports, require, module, __filename, __dirname) { import Koa from 'koa';
^^^^^^
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:511:25)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:456:32)
at tryModuleLoad …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过Facebook验证Webhook。所以facebook my-url/facebook/receive在nodejs的路由中点击了我的URL ,我想res.send(req.query['hub.challenge']);发送一个http响应。
我正在使用KoaJS。据我了解,Koajs将请求和响应对象合并到其中,ctx但是在阅读文档时,我找不到任何ctx.send类似的东西来发送http响应。
谁能给我一些指导或链接。
谢谢。
我正在使用koa2和koa-router以及sequelize.我希望能够根据他们在数据库中的角色来控制用户访问,到目前为止它一直在工作.我做了自己的RBAC实现,但是我遇到了一些麻烦.
如果用户没有访问权限,我需要在任何端点被命中之前退出执行,考虑到端点可以执行任何操作(如插入新项目等).这很有道理,我意识到我可能会使用Sequelize进行交易,但我发现这会增加更多的开销,截止日期即将结束.
到目前为止,我的实现看起来有点像:
// initialize.js
initalizeRoutes()
initializeServerMiddleware()
Run Code Online (Sandbox Code Playgroud)
服务器中间件在路由后注册.
// function initializeRoutes
app.router = require('koa-router')
app.router.use('*', access_control(app))
require('./routes_init')
Run Code Online (Sandbox Code Playgroud)
routes_init只运行一个递归解析文件夹并导入所有中间件定义的函数.
// function initializeServerMiddleware
// blah blah bunch of middleware
app.server.use(app.router.routes()).use(app.router.allowedMethods())
Run Code Online (Sandbox Code Playgroud)
这只是普通的koa-router.
但是,问题出现在access_control中.
我有一个文件(access_control_definitions.js),我在其中指定命名路由,它们各自的sequelize模型名称,以及路径存在哪些规则.(例如,如果所有者能够访问他们自己的资源,那么角色是什么...)我计算请求者是否通过路由参数拥有资源(例如,资源ID是ctx.params.id).但是,在此实现中,似乎没有解析params.我不认为我必须在koa-router之前手动解析params.是否有人能够找到一种基于此的更好的方法来解决ctx.params没有填充实际的命名参数?
编辑:我也为此创建了一个GitHub问题,考虑到我似乎有一些有趣的业务正在进行中.
我正在设置一个新服务器并希望支持高级上传功能。首先,我需要验证文件(文件类型、文件大小、最大计数),最后将其上传到某个目的地。我用 koa-multer 尝试了一些东西,但我无法得到 multer 验证错误。
multer.js
const multer = require('koa-multer')
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './public/uploads/')
},
filename: function (req, file, cb) {
var fileFormat = (file.originalname).split('.')
cb(null, file.fieldname + '_' + Date.now() + '.' + fileFormat[fileFormat.length - 1])
}
})
const fileFilter = (req, file, cb) => {
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
cb(null, true)
} else {
cb(new Error('This is not image file type'), false)
}
}
const …Run Code Online (Sandbox Code Playgroud) 我要解决一个诺言,然后像Koa 2一样呈现一个视图。
async function render(ctx, next) {
// wait for some async action to finish
await new Promise((resolve) => {
setTimeout(resolve, 5000)
})
// then, send response
ctx.type = 'text/html'
ctx.body = 'some response'
await next()
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,服务器不会发送任何响应(浏览器一直在等待响应,并且超时)。我究竟做错了什么?
我的问题是:
koa2中间件'/info' ctx.res.body ------>front-end get对象没有dataValues和其他值。只有像这样的对象{a:1,b:2}
在中间件中,我发现ser它有很多键值,例如{dataValue:{a:1,b:2},eviousDataValues:'xxx'}
为什么前端Object与ko2中间件中的'ser'不一样?
这是我的代码
let sequelize = new Sequelize('test', sqlOpt.name, sqlOpt.pwd, {
host: sqlOpt.host,
dialect: 'mysql',
port: sqlOpt.port,
pool: {
max: 5000,
min: 0,
idle: 10000
}})
let api = sequelize.define(
'api', {
id: {
type: Sequelize.STRING,
primaryKey: true
},
name: Sequelize.STRING,
method: Sequelize.STRING,
url: Sequelize.STRING,
description: Sequelize.STRING,
createTime: Sequelize.INTEGER,
did: Sequelize.STRING,
status: Sequelize.INTEGER,
content_type: Sequelize.INTEGER
}, {
freezeTableName: true,
tableName: 'apilist',
timestamps: false
})
module.exports = {
searchbyDid(params) { …Run Code Online (Sandbox Code Playgroud) koa2 ×13
node.js ×11
koa ×8
javascript ×3
ecmascript-6 ×2
koa-router ×2
async-await ×1
express ×1
namespaces ×1
sequelize.js ×1