Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

免费课程:API开发与管理利器——Node.js框架LoopBack

$
0
0

想学习快速搭建 REST 架构的 Node.js 服务吗? 想知道 Node.js 应用便捷访问数据源的方法吗? 想掌握扩展 Node.js 应用以应对多变的需求吗? 想了解如何将 Node.js 微服务部署在云上的吗? 来 LoopBack 系列课程吧!

开源技术*IBM 微讲堂将于 3 月早春,隆重开启五幕系列课程:《 Node.js 应用开发新秀——深入浅出 LoopBack 》,将这些问题一网打尽。

在眼下日益繁盛的 Node.js 社区里,LoopBack,作为渐趋流行的开源框架中的新秀,构建于鼎鼎大名的 Express 之上,正逐渐被广泛应用于面向 Web,Mobile,以及其他设备的 Node.js 应用的全栈开发中。LoopBack 有众多的应用案例,IBM 企业级社交应用产品就在向这个编程模型转型。借助 LoopBack 这一高度可扩展的开源 Node.js 框架,您可以:

✔ 仅使用少量代码快速构建出 RESTful 服务 ✔ 访问包括 NoSQL 数据库在内的各类数据源 ✔ 利用 Model 为关系型数据轻松建立模型 ✔ 基于函数库快速开发移动应用 ✔ 在云或者自有服务器上进行应用部署

本系列课程共计五幕,每周一幕,全方位讲述 LoopBack 的开发体验、核心理念、扩展手段、最佳实践和技术前瞻。让我们一起由浅入深,体验 LoopBack 开发的神奇之旅。精彩纷呈的满满干货,正期待着您的发掘,3 月 22 日,我们不见不散!

目标听众: 对 Node.js 框架 LoopBack 感兴趣的开发者,有编程基础同时想学习 Node.js 语言、使用 Node.js 开发全栈应用的开发者 。

课程安排: 报名成功后的同学可以在每周四晚上 8 点通过斗鱼和 WebEx 参加线上直播,也可以收看课程回放。具体安排如下:

3月22日 第一幕: 我们的第一个应用—初尝 LoopBack 的应用开发 3月29日 第二幕: 进入 Model 的世界—理解 LoopBack 的核心概念 4月12日 第三幕: 威力无比的百宝箱—扩展 LoopBack 的应用逻辑 4月19日 第四幕: 缤纷多彩的数据源—打开 LoopBack 的数据之窗 4月26日 第五幕: 内幕劲爆的最终章—深入 LoopBack 的方方面面

报名方法: 请进入活动行报名页面填写报名表格。 我们将在3月19日之前将课程邀请邮件发到您的邮箱,邀请您加入 LoopBack 微课堂微信群,进群即视为报名成功。接下来关注微信群的消息,就可以按时参加每周四晚上 8 点的 IBM 开源技术微课堂了。


重构cnode前端的时候,发现富文本上传图片的接口是要自己弄吗?

$
0
0

如题,小白求教,重构过的同学能告诉我吗?非常谢谢

【成都】科创科学文化研究院-web全栈(NodeJs)_6-12K

$
0
0

负责本单位有关网站的服务端开发和部分前端工作。投递简历前请注册科创论坛(www.kechuang.org),以此为例了解项目内容。

git:https://github.com/kccd/nkc

科创论坛是国内最早的科技爱好交流社区,主要服务于极客/特种科技爱好者,涉及火箭/航空航天、含能材料/化学化工、高压/电子电工等科技爱好领域,致力于为科技爱好者提供创造优质的互联网产品。

任职要求:

1、熟练运用javascript及JADE引擎进行各种页面和交互开发,对javascript+CSS开发模式有丰富的应用经验;

2、了解NODEJS的技术特点和开发要领,能够进行简单开发。

3、了解Arango数据库技术。

4、具有良好的审美能力(本单位未设UI设计和美工岗位,网站产品均为极简风格,需前端人员负责开发)。

经验要求: 1、应届毕业生至不超过5年工作经验,专科以上学历,软件工程、电子信息、自动化等相关专业。 2、有高并发网站设计经验,愿意向全栈工程师发展。

注意事项: 1、请在个人资料中详细阐述至少一项相关作品的研发过程。 2、如果您有与科技有关的业余爱好,如业余无线电/软件无线电、航空航天模型、天文观测等,请注明。

工作地点位于成都市成华区,距离地铁四号线玉双路站200米。 投递邮箱:bg8npk@deepace.net

纯前端学习node碰到瓶颈了,跪求建议。。。

$
0
0

本人前端,想学习node,大学时学过java,c之类的,不过都还给老师了。这是背景。 现在在学node,看文档,总感觉node的文档写的很糟糕,想找demo却发现纯node webserver的demo很少,都是用express包装过的… 碰到瓶颈了… 跪求大神给点建议…

如何判断一串数字是不是时间戳

记录一次由一行代码引发的“血案”

$
0
0

起因

我们之前的平台一直采用php+node双服务的模式进行开发,其中node一直作为中间层,没有大规模的部署,一方面由于团队node经验不足,不敢贸然替换,另一方面也听闻js一些关于内存泄漏方面的问题,故一直保持这样的架构 但是在去年,我们发现我们的业务如果采用node开发,不管是在响应速度还是在开发效率上(前端使用webpack),都要提高不少,于是我们决定把服务全线替换为node.js

开始的时候,我们使用了Koa,选择自己造轮子 我们参考借鉴了php框架yii2中的一些思路和设计模式,再结合我们的产品特点,打造了一套我们自己的node.js框架。由于大量参考yii2,导致了虽然在语言的转换上几乎没有遇到什么障碍,但与此同时我们也不得已做了很多hack。。也算是为此次的事件埋下了伏笔

问题

服务经过node.js改造之后成功上线,平滑过渡,本该是一件好事,但是我们通过监控发现,事情没有这么简单。。。 由于我们的产品在7-10点有一个使用的高峰期,但是监控发现服务经常在这个时间点挂掉,于是蹲守查看过程,发现状况如下 image.png可以看到有部分的服务内存已飙升到1G以上,并且迟迟不回落,经过几天的测试发现。。遇到了内存泄漏问题 于是我们开始着手排查,最开始怀疑可能是hack导致,故修改了部分代码,观察几天后发现上涨速度有减慢,但依然存在泄漏

排查

在我们无计可施的时候,我们尝试使用easy-monitor来定位泄漏点,不过由于环境的原因,并没有安装成功,于是联系了作者@hyj1991 在大佬的推荐下,我们使用了alinode进行监控,在@hyj1991 的帮助下,几分钟就定位到了疑似泄漏点的地方 不过,很滑稽的是,这个泄漏点和我们预想的方向完全不同…在此也分享给大家 image.png上面部分为产生泄漏的代码,在这里先不说为什么这样去写,先说一下这里产生泄漏的原因,根据@hyj1991 的解析,原因是这样的 image.png也就是说,delete后由于每次重新载入的push,Module中数组的数据又无法得到释放,最终产生leak经过@hyj1991的帮助,最终我们删除掉这部分代码,泄漏问题终于解决 (下图为修改后运行效果,可以看到内存占用很小,并且一段时间后会回落) image.png

另一个问题

泄漏的问题算是解决了,但其实还有另外一个问题,可能也有人会问,为什么要那样去写 其实一开始,写这个原因我是抗拒的,因为这实在是一个低级错误,但确实有必要跟大家分享一下 最初这么写的原因,是因为我们发现不知道什么原因在某个类当中操作另一个类,会影响另一个类的私有属性

大致意思上,可以这样去理解

function A(){
	//假设A有属性test
	this.test = '1';
}

function B(){
	var a = new A;
	a.test = '2';
}
var C = new B;
var D = new A;
console.log(D.test); // => 2 应该得到1,但我们得到了2

这让我们不能理解,理论上不应该这样,但就是找不到原因,猜测有可能是黑魔法导致的一些奇怪问题,最终因为偷懒+确实没找到问题所在,我们采用了用一个Model删一个Model的方式来解决。。。于是就出现了上面产生泄漏部分的代码

那么,既然泄漏已经知道是这里的问题,为了解决这个问题,我与@hyj1991 一步一步的进行分析,最终定位到这里 image.png由于之前在开发中,也使用了condition作为检索条件,所以我们在初期的排查过程中均没有发现这里的问题(我们把它当作了私有属性),因为在后面的开发中为了统一规范,已经弃用了condition改为where来作为检索条件,于是当我看到这一句代码的时候。。 image.png只能说。。。 image.png所以说,并没有修改它的私有属性,只是我们一直访问和修改的是他的原型链… 将其修改后,问题解决,发布线上,目前稳定运行中…

总结

首先第一点,非常感谢@hyj1991 对我们的帮助 其次alinode是真的好用,好用还免费,绝对的良心产品 从这次可以说是很的事故中,我们算是吸取了很多教训,但同时也得到了不少宝贵的经验

  1. 遇到问题不要慌,一定要仔细排查,一步一步来,就算找不到问题点,也不要想各种野路子来解决
  2. alinode好用,牛逼
  3. 目前阿里在node方面有非常强大的团队支撑,技术水平可以说是无人能敌
  4. 框架很重要,但团队的风格统一也是很重要滴

我们目前也正在慢慢将框架转为egg.js,同时再次感谢@hyj1991 ,也感谢阿里给我们广大node开发者提供了这么优秀的产品,感谢!

关于“血案”

其实也没什么,就是写这一行代码的同学已经被我们做掉了,祭天(手动滑稽)

我知道你们看烦了,但我还是要说一句,alinode真特娘好用

image.png

传送门:

alinode

基于Electron的简单网易云音乐客户端

$
0
0

介绍

只想安安静静看看歌词,听听音乐。

页面基于自己的一个pen

api部分基于一篇知乎专栏

代码地址

linux 和 mac下载地址

技术栈

  • Electron
  • Sequelize + sqlite3

功能

  • 搜索
  • 播放
  • 同步显示歌词

播放过的音乐和图片会存入$HOME/.Griever, 歌词会存入sqlite

待开发

  • 缓存文件管理
  • 播放列表
  • 更好的ui/ue

截图

Screenshot.png

谢谢

好运。

JavaScript 是好文明


多次刷新把服务器刷炸了。。。

$
0
0

突然遇到一个很奇怪的问题,正常运行的话没问题,但是如果一个页面多次刷新的话服务器端就会出现这个问题 image.png然后整个服务器就停止了。 请问一下这个write after end 报的是什么错误啊?下边列的没有一项是我写的文件

at write_ (_http_outgoing.js:625:15) at ServerResponse.write (_http_outgoing.js:620:10) at ReadStream.ondata (_stream_readable.js:639:20) at emitOne (events.js:116:13) at ReadStream.emit (events.js:211:7) at addChunk (_stream_readable.js:263:12) at readableAddChunk (_stream_readable.js:250:11) at ReadStream.Readable.push (_stream_readable.js:208:10) at fs.read (fs.js:2042:12) at FSReqWrap.wrapper [as oncomplete] (fs.js:658:17)

请问这个问题该从哪查起呢?

请教下,学生认证是如何做的?

$
0
0

请问,如何做学生认证的功能呢。查询了一下现有的API服务商,貌似只有一种是需要提供学信网账号密码来验证的。 不过使用支付宝等产品发现他们都是用户填写身份证号等信息就可以认证,请问这种是如何做的呢

腾讯云 服务器做活动 一年 120元 .赶紧来啊

理解 Koa 的中间件机制

$
0
0

理解 Koa 的中间件机制

中间件概念在编程中使用广泛, 不管是前端还是后端, 在实际编程中或者框架设计都有使用到这种实用的模型, 下面我们就来谈谈它的作用. <!-- more -->

面向切面编程(AOP)

相信很多人都听过所谓的 AOP 编程或者面向切面编程, 其实他们都是中间件模型的体现, 我举个例子, 在前端开发中, 产品会要求在代码中进行埋点, 比如 需要知道这个按钮用户点击的频率是多少, 但是这样的上报代码其实与实际的业务代码并无强关联, 更不要说在实际上业务代码已经封装成一个通用的函数或组件, 所以, 如果想不侵入业务代码而又满足埋点, 中间件模型或许能够满足需求, 来看一看简单的代码:

// 在原函数执行前执行 fn 函数
Function.prorotype.before = function (fn) {
  // 保存触发 before 的函数
  const self = this;
  return function (...args) {
    let res = fn.call(this);
    // 如果上一个函数未返回值, 不执行下一个函数
    if(res) {
      self.apply(this, args);
    }
  }
}

// 在原函数执行后执行 fn 函数
Function.prototype.after = function (fn) {
  // 保存触发 after 的函数
  const self = this;
  return function (...args) {
    let res = self.apply(this, args);
    // 如果上一个函数未返回值, 不执行下一个函数
    if(res) {
      fn.call(this);
    }
  }
}

上面这两个函数是通过在 Function.prototype 上添加两个函数: before, after. 两个函数的返回值都是一个函数, 这个函数会按照次序执行函数. 这样函数各自保持了他们的整洁性.但是这样的 before 与 after 函数的简单使用缺陷也是很明显的, 他们并不支持异步的函数, 而日常开发中异步的场景有非常多, 所以这样的代码还是只能在 demo 中使用, 不适合生产环境中使用.所以我们来看一下 koa 框架是怎么做的.

koa 中的中间件

koa 是 nodejs 中非常精简的框架, 其中的精粹思想就是洋葱模型(中间件模型), 它实现的核心就是借助 compose 这个库来实现的.这里我主要看的是 koa2 所使用的 compose 源码, 对于 koa1 的 compose 源码其实思想是一致的, 只不过它针对的是 generator 函数, koa2 针对的是 async 函数, 相比之下 async 会更符合潮流. 对于 compose 也就是 koa 的核心思想就是像下面这个图: 那么 compose 是怎么实现上面这个思想的呢? 下面我们来解读一下 compose 的源码, compose 的源码非常精简,

middleware in koa1

对于 koa1 来说, 它是基于 generator 函数与 co 类库的:

function compose(middleware){

  return function *(next){
    // 解释一下传入的 next, 这个传入的 next 函数是在所有中间件执行后的"最后"一个函数, 这里的"最后"并不是真正的最后,
    // 而是像上面那个图中的圆心, 执行完圆心之后, 会返回去执行上一个中间件函数(middleware[length - 1])剩下的逻辑
    // 简称圆心函数
    // 如果没有传入那就就赋值为一个空函数
    if (!next) next = noop();

    var i = middleware.length;
    // 从后往前加载中间件
    while (i--) {
      // 将后面一个函数传给前面的函数作为 next 函数, 前面函数中的 next 参数其实就是下一个中间件函数
      next = middleware[i].call(this, next);
      // 这里可以知道 next 函数都是 generator 函数
      console.log('isGenerator:', (typeof next.next === 'function' && typeof next.throw === 'function')); // true
    }

    // 使用 yield 委托执行生成器函数
    return yield *next;
  }
}

function *noop(){}

解释一下 koa1 中的 compose 为什么从后往前遍历中间件函数而且还使用了 call 函数执行了一次, 这个是因为 koa1 中默认函数都是生成器函数, 我们知道生成器函数 执行一次并不是真正地执行了函数内部的逻辑, 而是初始化得到一个生成器对象, 而在生成器对象生成的时候, 我们需要对函数需要的 next 函数进行传值, 所以会采用逆序遍历.

middleware in koa2

对于 koa2 来说中间件机制 compose 基于 async 与 Promise: 会稍微比 koa1 中的复杂一点

function compose (middleware) {
  // 传入的 middleware 参数必须是数组
  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
  // middleware 数组的元素必须是函数
  for (const fn of middleware) {
    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
  }

  // 返回一个函数闭包, 保持对 middleware 的引用
  return function (context, next) {
    // 这里的 context 参数是作为一个全局的设置, 所有中间件的第一个参数就是传入的 context, 这样可以
    // 在 context 中对某个值或者某些值做"洋葱处理"

    // 解释一下传入的 next, 这个传入的 next 函数是在所有中间件执行后的"最后"一个函数, 这里的"最后"并不是真正的最后,
    // 而是像上面那个图中的圆心, 执行完圆心之后, 会返回去执行上一个中间件函数(middleware[length - 1])剩下的逻辑

    // index 是用来记录中间件函数运行到了哪一个函数
    let index = -1
    // 执行第一个中间件函数
    return dispatch(0)

    function dispatch (i) {
      // i 是洋葱模型的记录已经运行的函数中间件的下标, 如果一个中间件里面运行两次 next, 那么 i 是会比 index 小的.
      // 如果对这个地方不清楚可以查看下面的图
      if (i <= index) return Promise.reject(new Error('next() called multiple times'))
      index = i
      let fn = middleware[i]
      if (i === middleware.length) {
        // 这里的 next 就是一开始 compose 传入的 next, 意味着当中间件函数数列执行完后, 执行这个 next 函数, 即圆心
        fn = next
      }
      // 如果没有函数, 直接返回空值的 Promise
      if (!fn) return Promise.resolve()
      try {
        // 为什么这里要包一层 Promise? 
        // 因为 async 需要后面是 Promise, 然后 next 函数返回值就是 dispatch 函数的返回值, 所以运行 async next(); 需要 next 包一层 Promise
        // next 函数是固定的, 可以执行下一个函数
        return Promise.resolve(fn(context, function next () {
          return dispatch(i + 1)
        }))
      } catch (err) {
        return Promise.reject(err)
      }
    }
  }
}

至于在一个中间件函数中两次调用 next 函数导致出错, 我这里提供一个简单的例子供大家参考:

async function first(ctx, next) {
  console.log('1');
  // async 与 co + yield 的模型不同, await 是需要后面是 promise 的函数, 并且自己执行一次, 而 co 是自己拿到 value 然后帮你自动执行.
  await next();
  await next(); // 两次调用 next
  console.log(ctx);
};

async function second(ctx, next) {
  console.log('2');
  await next();
};

async function third(ctx, next) {
  console.log('3');
  await next();
  console.log('4');
};

const middleware = [first, second, third];

const com = compose(middleware);

com('ctx', function() {
  console.log('hey');
});

如果第一个中间件中没有两次调用 next 函数, 那么正确的结果为 1 2 3 ‘hey’ 4 ‘ctx’. 对于出错的真正原因是如下图: 在第 5 步中, 传入的 i 值为 1, 因为还是在第一个中间件函数内部, 但是 compose 内部的 index 已经是 3 了, 所以 i < 3, 所以报错了, 可知在一个中间件函数内部不允许多次调用 next 函数.

总结

中间件模型非常好用并且简洁, 甚至在 koa 框架上大放异彩, 但是也有自身的缺陷, 也就是一旦中间件数组过于庞大, 性能会有所下降, 因此我们需要结合自身的情况与业务场景作出最合适的选择.

本文首发于本人博客: http://zhangxiang958.github.io/2018/03/16/理解 Koa 的中间件机制/

关于 nginx 反向代理和 express-session 无法获取到值的问题

$
0
0

我用 nginx 反向代理绑定了域名,但是无论如何发现存储不了session ,后来查出来原因是因为,通过反向代理访问 connect.sid 每次访问都会变,从而一直获取不到,求大神解惑啊。困扰好几天了

express 配置

app.set('trust proxy', 1); // trust first proxy
app.use(session({ 
  name:"DWlive",
  resave: true, 
  sameSite:'false',
  saveUninitialized: true, 
  secret: 'this word key'
}));

nginx 配置

server
{
    listen 80;
    server_name watchlive.dongweinet.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/watchlive.dongweinet.com;
    
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #SSL-END
    
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    error_page 502 /502.html;
    #ERROR-PAGE-END
    

    location / 
    {
        proxy_pass http://211.149.207.217:250;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-Proto true;
        
        #缓存相关配置
        proxy_cache cache_one;
        proxy_cache_key $host$request_uri$is_args$args;
        proxy_cache_valid 200 304 301 302 1h;
                
        add_header X-Cache $upstream_cache_status;
        
        expires 12h;
    }
     
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
}

vue写的功能最齐全的cnode社区网站

$
0
0

react版开发之后开发的vue版, 其实vue版跟react版结构基本上是没多大变化的,只是语法上不同。

这是目前react版和vue版功能最齐全的第三方cnode版本了!

如果你是刚接触react或vue这恰好是一个好机会

react版cnode点这里

源码github

在线预览

技术栈

"vue": "^2.5.2",
"vue-router": "^3.0.1",
"vuex": "^3.0.1",
"iview": "^2.10.1",
"axios": "^0.17.1",
"moment": "^2.20.1",
"webpack": "^3.6.0",
"simplemde": "^1.11.2",
"highlight": "^9.12.0",
"scss": "",
"ES6": "",
"flex": "",

开发目录

.
├── README.md
├── build
│   ├── build.js
│   ├── check-versions.js
│   ├── logo.png
│   ├── utils.js
│   ├── vue-loader.conf.js
│   ├── webpack.base.conf.js
│   ├── webpack.dev.conf.js
│   └── webpack.prod.conf.js
├── config
│   ├── dev.env.js
│   ├── index.js
│   └── prod.env.js
├── index.html
├── package-lock.json
├── package.json
├── src
│   ├── App.vue                     # 视图入口
│   ├── api                         # API配置文件
│   │   └── index.js
│   ├── assets                      # 处理静态资源文件目录
│   │   ├── images
│   │   │   ├── app-qrcode.png
│   │   │   ├── github.svg
│   │   │   └── not-match.gif
│   │   └── scss
│   │       ├── _variable.scss
│   │       ├── media.scss
│   │       └── style.scss
│   ├── components
│   │   ├── footer
│   │   │   └── Footer.vue          # 底部组件
│   │   ├── header
│   │   │   └── Header.vue          # 头部组件
│   │   ├── msg
│   │   │   └── Msg.vue             # 未读消息和已读消息列表组件
│   │   ├── sidebar
│   │   │   └── Sidebar.vue         # 侧边栏组件
│   │   └── topics-list
│   │       └── TopicsList.vue      # 话题列表组件
│   ├── main.js                     # 程序入口文件
│   ├── router
│   │   └── index.js                # 路由配置
│   ├── store
│   │   └── index.js                # 状态管理
│   └── views
│       ├── 404
│       │   └── 404.vue             # 404页
│       ├── collections
│       │   └── Collections.vue     # 收藏页
│       ├── index
│       │   └── Index.vue           # 主页
│       ├── login
│       │   └── Login.vue           # 登录页
│       ├── messages
│       │   └── Messages.vue        # 未读消息页
│       ├── release
│       │   └── Release.vue         # 发布/编辑页
│       ├── topic
│       │   └── Topic.vue           # 查看话题详情页
│       └── user
│           └── User.vue            # 用户详情页/个人主页
└── static                          # 静态资源目录
    └── images
        ├── 11.png
        ├── 22.png
        ├── 33.png
        └── 44.png

API清单 x 15

  • [√] 主题首页
  • [√] 主题详情
  • [√] 新建主题
  • [√] 编辑主题
  • [√] 收藏主题
  • [√] 取消收藏主题
  • [√] 用户所收藏的主题
  • [√] 新建评论
  • [√] 为评论点赞
  • [√] 用户详情/个人主页
  • [√] 登录
  • [√] 获取未读消息数
  • [√] 获取已读和未读消息
  • [√] 标记全部已读
  • [√] 标记单个消息为已读

启动程序

# install dependencies
npm install

# serve with hot reload at localhost:3888
npm start

# build for production with minification
npm run build


结语

  • CNode主题详情是使用markdown写的,样式可以使用github-markdown-css。
  • CNode提供的API获取主题没有返回总条数导致不能算出总页数, 所以我写死了250页。
  • 大部分功能都需要登录的,所以游客只能进行浏览,如果感兴趣的可以尝试登录, 不会保存你的accesstoken, 欢迎监督。
  • 发布话题和评论使用的markdown编辑器 simplemde
  • 因为托管在github上,所以首次打开的速度会稍微慢一点,之后基本上是秒开。
  • 这应该是一个很好的学习机会,Vue转react,react转Vue都很好上手。

学到东西不要忘了给个star哦,谢谢!


License

MIT

开源一个nodejs写的商城系统

$
0
0

zshop是一个nodejs写的商城系统,看完廖雪峰的《javaScript全栈教程》后,想练练手,已是开始踩坑之路。目前完成了首页,商品搜索,购物车,我的,登录,商品详情等,后面将继续完善其它功能。完善后会把数据库的er图画出来。

在线预览效果地址:http://120.78.200.74:3000/zshop/(pc浏览器请切换为手机模式)。部署在阿里云上面,centOS 6.5 64位1核cpu1g内存1m带宽40g普通硬盘,登录手机:18312345678,密码:123456。

一 部署方式:

1安装node.js(7.6版本以上,因为要支持async/await); 2安装mysql数据库(utf-8编码的配置),创建数据库zshop3下载本工程文件,可修改数据库的用户名密码等连接配置(middleware目录下的config-default.jsconfig-test.js两个配置文件),在根目录下执行npm install下载依赖库,然后执行node init-db.js(初始化数据库表和表数据); 4最后在工程根目录下执行node app.js,看到日志app started at port 3000...就代表启动成功了,浏览器访问http://localhost:3000/zshop/(pc浏览器请切换为手机模式)。

二 涉及的技术框架:

1前端:weui.cssjqueryjquery.spinnerrequirejsswiper-4.1.6vuevue-resource2后端:koa2koa-bodyparserkoa-routernunjucksmimemzkoa-compresssequelizemysqlkoa-session2log4js

三 工程目录的主要结构: |-zshop    |-controllers       //controller    |-html_template   //如果你只需要本项目的那些静态的html文件等    |-middleware    //本项目的koa2的一些middleware    |-models      //数据库实体    |-service       //service    |-static        //静态文件目录,包括图片,js,css等,这部分可以部署在nginx    |-views       //模板页面文件    |-app.js       //程序主入口文件    |-init-db.js       //执行这个可以初始化数据库表和表数据,谨慎执行    |-init-sql.sql       //init-db.js执行的sql文件   |-LICENSE       //MIT协议,拿走不谢    |-package.json   //依赖的库

四 一些截图:

imageimageimageimage

imageimageimage

五 如果你觉得对你有所启发,star一下或者扫码请我喝杯咖啡,金额任意。

image

六 我的博客:http://zhuwx.iteye.com/


react组件引入css文件在启动的时候提示css: Unexpected token, expected ;

$
0
0

大家好,我在做一个react项目,刚接触不久,还是新手我想请教一下:我在一个react组件中import一个CSS模块,为什么run build的时候没提示错误,但npm start就出错了,提示Unexpected token…希望大家能帮我找出问题所在。感激不尽!(已经在webpack里配置了相应loader了)附图:1.终端报错2.react组件(本例为Layout组件,引用1.CSS) 3.CSS文件内容 4.webpack配置 5.package.json依赖图 6.package.json里的scripts(包含build命令和start命令)3.PNGLayout.PNGcss.PNGwebpack.PNG依赖.PNGscripts.PNG

【待公测】基于 Egg 的 CNode 社区

$
0
0

在近期,经过社区的小伙伴们的一起努力下,我们基于 Egg.js 将 nodeclub 进行了重写,重写后的代码仓库位于 https://github.com/cnodejs/egg-cnode

原版的 nodeclub 是 2012 年左右,在淘宝实习的某个同学实现的,当时的情况下,几乎没有多少人有过 Node.js 开发真实项目的经验,因此,该项目也存在诸多稚嫩之处,曾经也被 ITeye 的大佬批判过。

后来在 alsotang、题叶等人的维护下,CNode 经历过一次较大的重构,但那次重构没有对原来的项目进行根本性的改动,重点是用户体验层面的改动。因此 nodeclub 依然保持着比较古老的方式,express + ejs + mongoose 等。原项目缺乏一些工程性的问题:

  1. 基于 Callback 回调的风格,在维护上较为困难。
  2. 没有健壮的进程守护机制,纯粹依靠 PM2 。
  3. 目前该项目运行时也是单机模式,没有更好的可用性。

本次我们基于 ES 8、Egg 框架,在不改写业务逻辑的前提下,对该项目完成了重写。重写之后的 egg-cnode 具有更好的特性,尤其是在可维护性上,有极大程度上的改进,在测试覆盖率方面,以更少的代码量实现了更高的覆盖率。重写过程历时 3 个礼拜,贡献人数 10 人,以社区协作的形式完成。

我们将在稍后的一个时间将新的版本进行上线测试,也欢迎大家关注我们新的代码仓库。最后感谢:@sinchang、@thonatos、@lqs469 等人参与的贡献。欢迎大家继续关注我们的项目。

nestjs依赖注入失败的问题

$
0
0

在使用nestjs的时候遇到无法实现依赖注入的问题。

使用中文文档的ModuleRef方式来实现authServiceuserService的依赖注入,但是报"Cannot read property 'check' of null"错误。

以下是部分代码。

auth.module.ts

@Module({
    imports: [TypeOrmModule.forFeature([AuthEntity])],
    components: [AuthService],
    exports: [AuthService],
})
export class AuthModule{}

user.service.ts

@Component()
export class UserService implements OnModuleInit {
    private authService: AuthService;

    constructor(@InjectRepository(UserEntity)
                private readonly userRepository: Repository<UserEntity>,
                private readonly moduleRef: ModuleRef) {
    }
	
    async test(user: UserEntity): Promise<UserEntity> {
	// "Cannot read property 'check' of null"
		const is = await this.authService.check(user);
    }
    onModuleInit() {
        this.authService = this.moduleRef.get<AuthService>(AuthService);
    }
}

版本信息

"@nestjs/common": "^4.5.9",
"@nestjs/core": "^4.5.10",

vue-design 桌面端页面可视化构建程序

$
0
0

vue-design

用Vue和Electron开发最好的页面可视化构建程序 <em>Your star is the greatest encouragement to me.</em>

功能

  • 使用electron构建的桌面端应用
  • 通过简单的配置引入UI组件库
  • 通过可拖拽的组件设计页面
  • 保存为.vue文件
  • 保存/导入一个项目

layout.pngcode.png

综述

本项目的初衷有二:

  • 是减少中后台应用的开发成本
  • 通过类axure的功能,让设计师的设计稿生成初步的.vue文件代码,打通设计师和前端间的隔阂

对于第一点,相信不少大公司有很多实践。例如阿里开源的ice工具走得是代码块复用的思路,非常值得借鉴。

而对于第二点,目前开源的也有不少项目,但都是基于web的。在我看来,可视化构建需要和文件进行强交互,所以我选择了vue和electron去开发一个桌面端应用。

目前,这个项目还是雏形,但已具备基本的功能,在代码实现上在目前vue的几个项目中是最简洁的(这也多得前人的经验)。这个项目我会长期跟进,有兴趣的求关注下:)

RoadMap

  • 编辑组件css (2018/03-2018/04)
  • 更多内置布局、区块和元件 (2018/03-2018/04)
  • 检测.vue文件改动并自动同步到项目中 (2018/04)
  • 物料市场 (2018/04)
  • 自定义插件和插件市场 (2018/05)

最后

本人会在4月份求职,广州地区,有好坑的话,求介绍:)

QQ:563303226 Github:L-Chris

若对vue/react对页面可视化构建有兴趣的,可以参考以下开源项目:

Vue

  • vue-design:本项目地址,求star:)
  • vuep:实时编辑组件代码并预览
  • Vue-Layout:拖拽,修改,预览代码等基本功能,思想比较好理解,可以当入门了解下
  • esview:除基本功能外,结合了后端进行组件上传/下载功能,代码质量相对高点

React

  • ice:阿里官方项目,主要走的是物料复用的思路
  • gaea-editor:作者对编辑器的实现有比较深入的研究,可以去了解下

node.js是不是一门编程语言

$
0
0

本人前端小白,今天突然纠结node.js是不是一门编程语言这个问题,如果是编程语言https://mp.weixin.qq.com/s?__biz=MzA4Mzc0NjkwNA==&mid=2650783992&idx=1&sn=a483be6bcae70ec9d6cba33b4dbf6423&chksm=87faa9cfb08d20d9ae34b628bedbf0653de68ac35ed1dda08235df7597645462ff634beb4d05&scene=0#rd为啥这个没上榜的,望大神告知

Viewing all 14821 articles
Browse latest View live