我正在研究与Koa一起构建一个Web应用程序,但是我还没有完全了解Hows,whens以及为什么选择 - 并应用 - 支持"使异步更容易"的技术/方法(下面列出).
总体而言,关于此主题的网络上的不同指南仍然使事情变得模糊,特别是在不断发展的最佳实践方面,或者至少是更好的方法,以及在什么情况下.在网络上似乎很少或根本没有把它全部放在上下文中.
我希望对这个大屁股庞大的帖子做出回应可以纠正这个问题.也许下面的问题可以激发某人写一篇完整的博客文章等来解决这个问题.我的感觉是,我甚至没有接近唯一一个从中受益的人.
因此,如果明亮的社区能够帮助回答并明确以下列出的技术(粗体字),我会很高兴:
- a)如何以及在何种情况下(如适用)它们相互补充,补充,替代和/或重叠解决方案?
- b)在速度性能,错误处理容易性和调试简易性方面,他们的权衡是什么?
- c)何时,何地以及为什么使用"this"与"that"技术,技术组合和/或方法更好?
- d)哪些技术或方法(如果有的话)可能是"调光星".
(希望可以很好地解释作为答案一部分的意见.)
==============================
技术:
*Koa*
我的理解:
Koa是构建节点应用程序的最小基础,旨在利用ECMAScript-6功能,其中一个特性是生成器.
*Co*
我的理解:
- Co是一个用于运行ECMAScript-6生成器(它们是Node .011和谐的本机)的实用程序库,目的是为了编写用于运行和管理生成器的样板代码的一些/多(?)需要.
- Co本质上是Koa(?)的一部分.
具体问题:
- 如果以及如何在Koa中使用Co而不是在非Koa上下文中使用Co.换句话说,Koa是完全立面Co吗?
- 如果有更好的产品库,Co可以用Koa替换其他类似的生成器库吗?有吗?
*承诺"Q"和Bluebird*等图书馆
我的理解:
- 它们在某种意义上是"polyfill"用于实现Promises/A +规范,如果Node直到运行该规范.
- 他们还有一些非规范的便利工具,用于促进使用承诺,例如Bluebird的promisfyAll实用程序.
具体问题:
- 我的理解是ECMAScript-6规范确实/将在很大程度上反映Promises/A +规范,但即便如此,Node 0.11v和谐本身并不实现Promises.(这是正确的吗?)但是当它出现时,Q和Bluebird等技术是否正在逐步推出?
- 我读过"Q"和Bluebird支持生成器的内容.这是什么意思?例如,它在某种程度上是否意味着它们在某种程度上提供了与Co相同的效用,如果是这样,那么在多大程度上呢?
*Thunk和Promises*
我认为我对它们是什么有一个公平的处理,但希望有人可以提供一个简洁明了的"电梯间距"定义每个是什么,当然,如上所述,解释何时使用一个与另一个 - 在Koa环境中而不是在它中.
具体问题:
- 使用像Thunkify(github com/visionmedia/node-thunkify)使用像Bluebird这样的东西的赞成和利弊?
==============================
为了给这篇文章及其问题提供一些进一步的背景,如果可以对以下网页中提供的Koa技术进行讨论和对比(特别是在优点与缺点的基础上),这可能会很有趣:
- a)www.marcusoft.net/2014/03/koaintro.html(在哪里是thunk或promises,还是我没有看到什么?)
- b)strongloop.com/strongblog/node-js-express-introduction-koa-js-zone(同样,那里是thunk还是promises?)
- c)github.com/koajs/koa/blob/master/docs/guide.md("下一个"参数等于什么,设置它和在哪里?)
- d)blog.peterdecroos.com/blog/2014/01/22/javascript-generators-first-impressions(不是在Koa上下文中,但是介绍了Co与promise库(Bluebird)的使用,所以我假设这里提供的技术/模式借出本身是用在Koa(?).如果是这样,那么有多好?
谢谢大家!
我想弄清楚如何将我的路线拆分成单独的文件.
到目前为止,我有这个,但它不起作用.我Not found试图访问时得到的http://localhost:3001/api/things
//server.js
var koa = require('koa');
var app = koa();
var router = require('koa-router');
app.use(router(app));
require('./routes')(app);
// routes.js
module.exports = function *(app){
app.use('/api/things', require('./api/things'));
};
// api/things/index.js
var Router = require('koa-router');
var router = new Router({
prefix: '/api/things'
});
router.get('/', function *(){
this.body = [{ name: 'Foo'}, { name: 'Bar' }];
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud) 我正在使用koa-router.
如何获取请求的查询字符串参数?
这是我设法写的最好的:
import koaRouter from 'koa-router';
const router = koaRouter({ prefix: '/courses' });
router.get('/', async (ctx) => {
console.log(ctx.qs["lecturer"]);
});
Run Code Online (Sandbox Code Playgroud)
但是qs未定义
任何帮助将深表感谢!
我有一个Koa服务器使用webpack-dev-middleware和webpack-hot-middleware做热模块替换(HMR),所以中间件使用websocket将更改推送到客户端.
但是我的应用程序代码也需要在客户端和Koa服务器之间拥有自己的websocket连接.我不知道如何实现这一目标?似乎这两者是相互矛盾的.我能和他们并排吗?
我的服务器代码看起来像这样
const compiler = webpack(webpackConfig)
const app = new Koa()
app.use(webpackDevMiddleware(compiler, {
quiet: true,
noInfo: true
stats: {
colors: true,
reasons: true
}
})))
app.use(webpackHotMiddleware(compiler))
const server = require('http').createServer(app.callback())
const io = require('socket.io')(server)
io.on('connection', function() { console.log('socket connection!!') })
Run Code Online (Sandbox Code Playgroud)
和我的客户一样
import Client from 'socket.io-client'
const io = Client()
io.on('connection', (socket) => {
console.log('+++ io connected! ++++')
io.on('disconnect', () => { console.log('disconnected', socket) })
})
Run Code Online (Sandbox Code Playgroud)
HMR套接字工作正常,但另一个正在尝试与之交谈
GET /socket.io/?EIO=3&transport=polling&t=1446911862461-0并且这些请求失败.
如何创建不与HMR套接字冲突的websocket?
一个例子
generator.js:
exports.read = function *(){
var a = yield read('co.github.js');
var b = yield read('co.recevier.js');
var c = yield read('co.yield.js');
console.log([a,b,c]);
}
function read(file) {
return function(fn){
fs.readFile(file, 'utf8', fn);
}
}
Run Code Online (Sandbox Code Playgroud)
co.js:
var co = require('co');
var fs = require('fs');
var gen = require('./generator')
/*function read(file) {
return function(fn){
fs.readFile(file, 'utf8', fn);
}
}*/
co(gen.read)()
Run Code Online (Sandbox Code Playgroud)
似乎exports不支持发电机功能.
require, module, __filename, __dirname) { module.exports.read = function *(){
^
SyntaxError: Unexpected token *
at exports.runInThisContext (vm.js:69:16)
at …Run Code Online (Sandbox Code Playgroud) 因为我花了一些(太多)时间来弄清楚这个简单的要求.我在这里记录了multipart/form-data使用Koa 实现体解析的方法.
就我而言,混淆的原因是那里有可供选择的替代品:
我想找到最简约/最接近的express/koa/node做法/做事哲学.
所以这就是.下面.在接受的答案.希望这可以帮助.
我想要做的是在调用索引路由(即localhost:3000)时提供index.html文件.
我使用koa-router进行路由,所以我的路由如下:
app.all("/", function * (next){
//Send the file here
});
Run Code Online (Sandbox Code Playgroud)
我试着像这样使用koa-static:
var serve = require('koa-static');
app.all("/", function * (next){
serve("index.html");
});
Run Code Online (Sandbox Code Playgroud)
但那没用.然后我尝试使用co-views(我现在将html文件放在公共目录中):
var views = require("co-views");
var render = views("public");
app.all("/", function * (next){
this.status = 200;
this.body = yield render("index.html");
});
Run Code Online (Sandbox Code Playgroud)
但那没用.
那么有谁能告诉我我必须做什么?
Koa和Express 4.0都是相当新的,从我读过的,Koa是由Express团队制作的.
根据我的理解,Koa需要节点的功能,这些功能仅在节点的0.11(不稳定分支)中可用,并且还使用生成器.Express 4.0似乎只是Express框架的下一个版本.
我完全没有任何差异吗?是否可能(基于Express团队公开声明的内容)Koa和Express将来会在某个时候合并?
谢谢!
我正在使用Koa.js框架和Mongoose.js模块.
通常从MongoDB获取结果我的代码如下:
var res = yield db.collection.findOne({id: 'my-id-here'}).exec();
Run Code Online (Sandbox Code Playgroud)
但我需要为名为'items'的数组的每个元素执行此行.
items.forEach(function(item) {
var res = yield db.collection.findOne({id: item.id}).exec();
console.log(res) // undefined
});
Run Code Online (Sandbox Code Playgroud)
但是这个代码没有运行,因为函数中的yield.如果我写这个:
items.forEach(function *(item) {
var res = yield db.collection.findOne({id: item.id}).exec();
console.log(res) // undefined
});
Run Code Online (Sandbox Code Playgroud)
我也没有得到res变量的结果.我试图使用' generator-foreach '模块,但这并没有像这样工作.
我知道这是我对Node.js的语言素养缺乏了解.但是你能帮助我找到一种方法吗?
如何扩展第三方声明文件?
例如,我想Context从@types/koa扩展并添加一个额外的字段(resource)。
我试过这个:
// global.d.ts
declare namespace koa {
interface Context {
resource: any;
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用:
error TS2339: Property 'resource' does not exist on type 'Context'.
Run Code Online (Sandbox Code Playgroud)
产生此错误的代码的简化版本:
import {Context} from 'koa';
import User from './Models/User';
class Controller {
async list(ctx: Context) {
ctx.resources = await User.findAndCountAll();
ctx.body = ctx.resources.rows;
ctx.set('X-Total-Count', ctx.resources.count.toString());
ctx.status = 200;
}
}
Run Code Online (Sandbox Code Playgroud)
打字稿 v2.4
// tsconfig.json
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"moduleResolution": "node",
"noImplicitAny": true,
"experimentalDecorators": …Run Code Online (Sandbox Code Playgroud) koa ×10
node.js ×7
javascript ×5
generator ×3
express ×2
koa-router ×2
bluebird ×1
body-parser ×1
co ×1
foreach ×1
frameworks ×1
mongoose ×1
promise ×1
query-string ×1
socket.io ×1
typescript ×1
webpack ×1