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

处理图片的时候会阻塞服务器,请教下,有什么好的解决方案么?

$
0
0

服务器需要将上传收到的几张图片进行裁剪并合成,用了jimp这个库,print绘制文本,和write保存图片到本地比较耗时,这个过程中服务器完全无法响应其他请求。

请教各位前辈,一般这种情况怎么处理好?还是说node服务器本身就不适合用来处理图片?


请问这两个http请求是等效的吗?

$
0
0

http.requestreq.PNGhttp.getget.PNG

我用第一种方法(http.request)没有任何响应,用第二种(http.get)就可以拿到数据。

深入理解React源码 - 界面更新 VI

node有 namespaces,cgroups 包没

[远程机会]·[求贤若渴] Node.js Full Stack Engineer · 可年后入职

$
0
0

我们是英特吉姆Integem,是总部在美国硅谷的 Startup。Integem 专注于打造新一代的现实增强平台,创办人拥有多项相关专利。目前业务迅速发展,急需优秀人才加入。

**职位诱惑:**发展前景好,挑战性工作,带薪年假,出国机会,可以在任何地方工作。 待遇: 15K-25K; 14 月薪水,优秀者上不封顶。有原始股票,年终分红和奖励。

是否有些心动?小伙伴们赶快简历丢过来。

职位介绍我们是扁平化的团队结构,成员间互相信任、尊重和包容。由于是远程分布式团队,要求成员有强大的自我驱动力和独立性,不需要持续监督,擅于沟通和配合。 使用 Node.js 进行全栈开发,技术栈是 ES6/7 Javascript,Node,Express,MySQL,SocketIO,WebRTC,Vue,Babel,Webpack,Gulp,Electron。我们鼓励使用前沿的技术,会给予你很大的发挥空间,同时也要求你能独当一面、能力卓越。

任职要求本科及以上学历,计算机及相关专业; 具有 Node, Express, HTML5, CSS3 等开发经验; 至少熟练使用 React、Vue 或 Angular 中的一种,有实际项目经验; 熟悉至少一种关系型数据库,如MySQL/PostgreSQL; 熟悉团队开发流程,熟练使用 git 工具进行代码管理; 编写模块化的,高质量的代码,并能积极参与到 Peer code reviews; 有较强的 Troubleshooting 能力,能独立研究和解决问题; 具备以下资格优先考虑:你位于上海附近城市; 熟悉 Node.js 之外的一门后端语言,如Java/Python/Golang等; 对前沿的 Web 技术(如 HTML5、Node.js )有强烈兴趣,有良好的学习能力和强烈的进取心; 有较强的学习能力和较高的学习热情;具备积极向上的创业心态,良好的职业素质,具备成熟的团队协作意识; 请把简历寄到:cnode2018@gmail.com

关于验证登录

$
0
0

我自己目前使用的验证方式是这样的: 客户登录的时候,登录验证通过,就把req.session中的一个属性设为true,比如req.session.authenticated=true 然后对于登录的判断,就是客户访问接口的时候,检查req.session.authenticated是否为true。 感觉这样不是很严谨,所以想问下这样做的弊端是什么,还有有什么更好点的方式来做验证。

用vue做多页面没有用v-router路由怎么做登录拦截

$
0
0

跳转都是用a标签,只能进入页面才判断是否要登陆,没有v-router的钩子函数来拦截,求解决方案

多页面加载 js 文件问题

$
0
0

A页面上 有 a1、a2、a3 按钮,绑定了事件 B页面上 有 b1、b2、b3 按钮,绑定了事件 C页面… D页面… …

问题: 绑定事件都写到一个 js 文件呢? 还是两个 js 文件,引用各自的 js 文件呢?

另外: 整个网站 css 都是写到一个 style.css文件 js 如果也这样: JQuery $ 查找 dom 节点,影响性能么?或者可以忽略不计? 代码不严谨时,报一些 not found 之类的 error


请教各位大佬:如何设置一个crawler.js成为一个可以通过web调用的api?

$
0
0

项目背景是这样的:我使用reactjs做了一个静态页面可以对parse后端进行CRUD操作,另外还有一个爬虫脚本可以通过命令行运行,但是我要部署到服务器上的时候,希望能跟通过这个静态页面调用这个爬虫脚本,因为我对reactjs和node都不是很熟练,所以只想到在express里面调用这个脚本,不知道还有没有更好的办法?因为我是打算部署项目到heroku上面,所以不能再启动一个进程了,各位大佬有什么好办法吗?

关于Nodejs链接mysql乱码问题

$
0
0

查了半天,基本都说是要改mysql的charset为utf8或者给createConnection加一个charset: ‘UTF8_GENERAL_CI’,然而… 执行 搜狗截图20180201124357.png结果 搜狗截图20180201124332.png但是!执行 搜狗截图20180201124434.png结果! 搜狗截图20180201124451.png可是啊! 搜狗截图20180201124558.png而且! 搜狗截图20180201124635.png

好吧,实在是不知道还有什么地方有编码设置了…文本编辑器? 搜狗截图20180201124930.png好了!还有谁!!!???

两个不同的 node 的项目都用 nginx 代理,对于路径的处理为啥不一样

$
0
0

主站点为 www.123.com

www.123.com/a/代理 A 项目

www.123.com/b/代理 b 项目

两个项目的主页HTML都有 <link href=“favicon.ico” rel=“icon”> 这段代码,但实际分别访问2个项目时,在浏览器显示却是存在 2 种结果:

A 项目www.123.com/a/页面对于 favicon.ico 的链接地址处理为: http://www.123.com/a/favicon.ico是正确的

B 项目www.123.com/b/页面对于 favicon.ico 的链接地址却为: http://www.123.com/favicon.ico缺少了/b/路径

两个项目的Nginx代理配置完全一样,唯独项目的构建 http 的程序不一样,我看了下,A 是通过 gulp+browserSync 的,B 是通过 angular-cli 的 ng 。

至于解决,我知道有几个方式,但是我最想搞清楚的是为什么会存在这种情况,有人知道吗?

React Native打造CNode客户端

$
0
0

今天开始,用React Native 从0一步步的开发出一个跨平台的CNode客户端,以此来提高自己对React Native 的理解。因为之前已经写了一次这个客户端,所以第二次希望能深入的了解和学习RN,并且提升自己的代码质量

18集 Node.js 视频入门教程 - 全部免费观看

新手跪求答案。。。nodejs的服务器没响应。按CTRL+C又可以了

$
0
0

我最近在自学nodejs
自己写了一个前端页面通过ajax请求服务器,服务器收到信息后存到mysql 并把收到的信息打印出来

我发现有一个没有规律出现的问题,就是运行的好好的 忽然前端页面提交的信息后服务器没反应了,也不打印出来,但是按了ctrl+c后

又立马运行并打印出来收到的信息,,,求大神指教为什么啊

我是不是描述的有点混乱。。

Express中转接口,问题很多,实在没辙了

$
0
0

需求

将前端的所有请求转发到其他网站,并将 response 返回给前端

实现

router.all('/*', function (req, res, next) {
  let jar = request.jar();
  // 以下三步可对不同的 cookie 循环调用
  let cookieStr = 'key=' + req.cookies['key'];
  let cookie = request.cookie(cookieStr);
  jar.setCookie(cookie, config.host + req.url);
  const p = request(config.host + req.url, {
    method: req.method,
    form: _.clone(req.body),
    jar: jar
  });
  req.pipe(p);
  p.pipe(res);
  p.on('error', handleError(next));
});

期间遇到的问题

  • post 请求带有 form 的时候会报错:write after end 解决方法:将req.pipe(p)那一行注释掉,但是却不明白为什么,很难受 详见:https://github.com/request/request/issues/1664
  • 不能传输文件 未解决,将req.pipe(p)会一直 pending,取消注释以后会报 too many parameters
  • 怪象:将 form: _.clone(req.body),注释掉以后,居然会提示 user not login 这个不算 bug 吧,只是感觉奇怪

如何改进这个方法才能完全解决上面所说的问题


不好意思再次麻烦各位大佬,但是实在没辙了 心乱如麻,表达估计不太准确,有兴趣的大佬可以来拍


大家好,你们做多表关联的时候,怎么设计表关联啊?选用什么数据库

$
0
0

比如,做一个好友功能,添加好友,好友列表,就是随便点个人,可以看到他有多少好友关注等,这个是用到查数据库里面的好友列表,请问设计这个好友列表,怎么设计比较好

来自酷炫的 CNodeMD

使用eoLinker进行API接口自动化测试——简易模式(UI)

$
0
0

一般而言,自动化测试涉及以下几个方面: 1、自由设定API测试顺序; 2、API之间存在数据关联,比如后面接口的请求参数会绑定前面接口的返回结果等; 3、支持对返回结果进行校验; 4、支持对数据进行处理,比如在测试登录接口时对密码进行加密等; 5、支持高级的代码用例,可以用代码来实现控制测试流程的目的,一般语言有js; eoLinker支持上述提到的所有功能,并且是目前全球唯一一款支持UI界面创建自动化测试的产品,用于自动化测试非常方便,并且用户体验相比于Postman等工具要好许多。 本篇主要记录eoLinker自动化测试中的简易模式(UI)。

一.入门

eoLinker是目前国内最大的在线API管理平台,使用自动化测试需要拥有eoLinker账号,免费注册使用:官网除此之外还需要安装eoLinker官方提供的API测试增强插件,这个插件用于进行跨域测试以及自动化测试,官方提供了Chrome以及Firefox两个版本。 注册登陆之后,创建一个API项目,录入API文档,然后切换到自动化测试功能即可进行测试。 1.png

二.单例和用例

单例是自动化测试下面的一个基本单位,通俗地讲,单例也就是“单个API的测试条件和结果”。比如有一个用户登录接口,传递abc和123作为请求参数,然后返回”OK”作为成功的结果。 用例则是多个单例的合集,一个用例可以包含1~无限个的单例,并且把这些单例按顺序组合起来。比如测试完整的用户登录流程(注册-登录-判断登录状态-退出登录)。

三.环境变量

和Postman一样,eoLinker也提供了环境变量的功能,帮助用户快速对测试API的环境进行切换,而不需要对API进行修改(比如开发和生产环境的参数和地址可能不同)。 不同的是,eoLinker的环境变量功能要更加强大,除了设置全局变量,eoLinker里面可以设定所有API的地址前缀、请求头部等信息。 在环境管理中创建好环境,在自动化测试的时候就可以根据不同的环境随时切换,非常方便。

四.创建单例

如果你已经在接口管理中把API信息录入完毕,那么在创建单例的时候可以直接将接口文档导入,节约绝大多数的时间。或者我们也可以手动去录入单例的信息。 其中包括: 1、单例名称 2、API URL 3、请求参数 4、返回结果的判断条件 由于本篇文章介绍的是简易模式的自动化测试,以上的所有操作都将在UI界面中完成,不需要编写任何代码,操作上要简单许多。高级模式(代码)相关文章请点击这里2.png

五.设置单例之间的数据关联

回顾刚才提到的用户登录流程(注册-登录-判断登录状态-退出登录),在这里我们发现除了第一个注册API之外,其余的API的请求参数或多或少会使用到前一个或几个API的返回值。比如登录的用户名密码是注册的用户名密码,判断登录状态需要知道登陆之后的token等。 eoLinker的自动化测试也提供了这样的功能,可以用图形化的界面非常方便地设置API之间的数据关联。我们在填写单例的请求参数信息时,右侧会出现“关联”的按钮,点击之后就可以选择该请求参数需要关联哪一个API的返回结果。 3.png4.png

六.API自动化测试

编辑完所有的单例之后,就进入到最后的测试阶段。eoLinker可以对单例单独做测试,也可以进行批量的用例测试。 在用例中点击测试按钮就会把所有的API测试一遍,然后遇到报错还会提供相关的反馈信息,比如和预设的结果对比。

七.示例(注册-登录-判断登录状态-退出登录)

1.创建注册单例 5.png 2.设定请求参数和返回结果的判断条件 3.类比创建后续的API单例,但是可以为请求参数加上关联条件(下图中token绑定了上一个登录接口的返回token值) 6.png 4.测试并检查返回结果 7.png8.png 5.测试完毕,整个过程不超过10分钟,并且以后每当项目更新之后都可以跑一遍所有的自动化测试,极大的节省了开发测试的时间。

结语

eoLinker还提供了导入Postman数据的功能,从今以后可以考虑抛弃Postman了。

附录

eoLinker是一个针对开发人员需求而设计、免费而且开源的API接口管理平台,提供自动生成API文档、API自动化测试、Mock测试、权限管理、团队协作等功能,旨在解决由于前后端分离导致的开发效率低下问题,吸收了Postman以及RAP等接口管理产品的优点,提倡远程办公和敏捷开发,让开发者进行接口管理更加简单。

中文网址:https://www.eolinker.com

使用electron和vue,以ipc通信的方式构建客户端版本的掘金首页

$
0
0

1. 使用electron-vue新建基于vueelectron环境,更多配置请访问源项目

npm i -g vue-cli
vue init simulatedgreg/electron-vue my-project
cd my-project
npm i
npm run dev

2. 打通electron主进程与渲染进程的通信

定义常量作为channel,也就是事件类型名称

const CLIENT_NORMAL_MSG = 'CLIENT_NORMAL_MSG'  // 渲染进程发出消息类型
const CRAWLER_NORMAL_MSG = 'CRAWLER_NORMAL_MSG' // 主进程发出消息类型
渲染进程

在渲染进程中,使用vue plugin的形式,具体参见vue官方文档插件

ipcRenderereventEmitter的一个实例,在渲染进程中使用,你可以通过它来像主进程发送同步和异步消息,也可以通过它来接收来自主进程的消息

  const { ipcRenderer } = require('electron')
  const ipcService = Object.create(null)
  const callbackCache = []

  ipcService.install = Vue => {
    Vue.prototype.$ipcRenderer = {
      send: (msgType, msgData) => {
        ipcRenderer.send(CLIENT_NORMAL_MSG, {
          type: msgType,
          data: msgData,
        })
      },
      on: (type, callback) => {
        callbackCache.push({
          type,
          callback,
        })
      }
    }
    ipcRenderer.on(CRAWLER_NORMAL_MSG, (sender, msg) => {
      callbackCache.forEach(cache => {
        if (cache.type === msg.type) {
          cache.callback && cache.callback(msg.data)
        }
      })
    }) // 监听主进程的消息
  }

  export default ipcService

vue项目中通过this.$ipcRenderer.on的方式添加主进程发送消息的监听,通过this.$ipcRenderer.send的方式向主进程发送消息,保证发出消息均为CLIENT_NORMAL_MSG类型,收到消息均为CRAWLER_NORMAL_MSG,通过消息中的二级固定参数type来区分具体类型,并可以通过detach的方式来取消特定的类型的消息的监听

最后在Vue的入口文件,也就是渲染进程的入口文件使用上面定义的插件 Vue.use(ipcService)渲染进程中的配置完成


主进程

使用class的方式来定义,需要传入两个参数来实例化这个class,需要传入两个参数,listener为监听消息者,sender为发送消息者

ipcMsgHandler中包含了所有的handler,为其传入this以便能够在其中向渲染进程发送消息

  import ipcMsgHandler from './ipcMsgHandler'

  export default class Ipc {
    constructor(listener, sender) {
      this.listener = listener
      this.sender = sender
      this.addListener(CLIENT_NORMAL_MSG, this.handleFn.bind(this))
      this.handlerList = ipcMsgHandler(this)
    }

    handleFn(event, data) {
      try {
        this.handlerList[data.type](event, data.data)
      } catch (error) {
        console.error('handler event error:' + error.message)
      }
    }

    addListener(chanel, cb) {
      this.listener.on(chanel, cb)
    }


    _sendMsg(chanel, msgBody) {
      this.sender.send(chanel, msgBody)
    }

    sendToClient(type, data) {
      this._sendMsg(CRAWLER_NORMAL_MSG, {
        type,
        data,
      })
    }
  }

初始状态下ipcMsgHandler.js文件

export default _ipc => ({})

在主进程的入口文件(/src/main/index.js)中对Ipc这个class实例化,其中需要使用的listeneripcMainipcMainipcRenderer不同,它只负责对消息的监听,不复杂发送消息,这里需要入口文件中的mainWindow下的webContents作为消息的发送者,所以需要在mainWindow创建成功之后再进行Ipc的实例化

// ...
function createWindow() {
  mainWindow = new BrowserWindow({
    // ...
  });
  new IpcMgr(ipcMain, mainWindow.webContents)
}

3. 完成具体功能开发

引入element-ui,使用babel配置css按需加载,具体配置方式element-ui官网

分析掘金首页数据来源

掘金首页七种分类下数据均来自一个接口,https://timeline-merger-ms.juejin.im/v1/get_entry_by_rank?src=web&limit=20&category=xxx,通过category进行分类的区分

渲染进程开发

App.js中,在进入页面和切换分类时向主进程发送消息

// ...
  methods: {
    startRequest() {
      this.$ipcRenderer.send('start-request', this.activeCategory)
    },
    onRequestBack() {
      this.$ipcRenderer.on('request-back', data => {
        // todo...
      })
    },
  }

主进程开发

现在渲染进程中已经定义了两种消息类型start-requestrequest-backstart-request告诉主进程开始执行任务,完成后request-back告诉渲染进程任务完成,渲染进程收到消息后通过收到的数据来对页面进行操作。

ipcMsgHandler.js中进行拓展,使用axios对接口内容进行抓取

  import axios from 'axios'
  const handlerList = _ipc => ({
    ['start-request'](event, category) {
      const requestBack = data => {
        _ipc.sendToClient('request-back', data)
      }
      axios.get(`https://timeline-merger-ms.juejin.im/v1/get_entry_by_rank?src=web&limit=20&category=${category}`)
        .then(r => {
          if(r.status === 200) {
            requestBack({
              success: true,
              rows: r.data.d.entrylist
            })
          } else {
            requestBack({
              success: false,
              error: `server error code: ${r.status}`
            })
          }
        })
        .catch(e => requestBack({
          success: false,
          error: `server error code: ${e.status} msg: ${e.message}`
        }))
    }
  })

请求完成后,通过requestBack向渲染进程发送消息,渲染页面,操作样式调整,页面看起来大概是这样。

4. 增加链接跳转到默认浏览器

在该项目中如果直接使用window.open的方式来打开的话,它会新弹出一个electron窗口,所有连接跳转也需要用到ipc的方式

electron中,有一个shell对象,它提供一个openExternal的方法来在默认浏览器中打开链接

ipcMsgHandler.js中新增以下内容

  const { shell } = require('electron')
  export default _ipc => ({
    ['open-shell'](event, url) {
      shell.openExternal(url)
    },
    // ...
  })

现在就可以在vue中通过this.$ipcRenderer.send('open-shell', url)的方式来在默认浏览器中打开链接了

一个通过打通IPC通信方式的掘金首页概览客户端就完成了,通过npm run build就可以对这个应用进行打包了

PS: 其实在electron中是可以支持跨域访问的,只需要在创建窗口的时候加上一下配置项就行了,不过结果其实并不重要,重要的是过程了

webPreferences: {
  webSecurity: false,
}

以上代码都可以在github上找到,欢迎star~~~

分享一个使用express + mongodb + bootstrap 的项目框架。

$
0
0

使用nodejs + mongodb 快速构建项目,前端使用基于bootstrap风格的ui,可用于各种场景的web风格。 传送点安装部署 nodeJs(v8.0以上) 、mongodb(3.4)、

  1. 安装 Node.js[必须] `MongoDB[必须]``
  2. 启动mongodb
  3. install 依赖包
  4. 启动npm run (dev | prod)启动项目
  5. 访问地址http://localhost:8888 开发模块流程 1.1 page部分
  6. 在 /assets/views目录新建模块目录 比如: blog/ ,目录里面放需要的html,比如发布blog,可以创建create.html。
  7. 在 /assets/js目录新建1里面使用的js 文件,在html引用js文件。 1.2 server部分
  8. 在 /models/目录新建1.1部分功能需要的mongoose model
  9. 在 /controllers/目录新建1所需要的controller目录,里面放page 和api两个文件,命名方式就按模块.page、模块.api来命名以区分功能。注入路由
  10. 在config/common目录的menu里面添加菜单。
  11. 在config/development、production配置的controllers里面引入需要起作用的CONTROLLER。
  12. 保存更改nodemon会自动重启项目。前台就可以看到对应的模块了。

pm2 cluster 模式下log4js使用问题

$
0
0

node@6.9.1 pm2@2.9.1 pm2 start -i 4 test.js 这种模式下,写文件,会出现数据丢失的情况,不知道各位大神有没有遇到过?里面有啥坑吗,github里有issues也翻过,并没有解决,求解救

Viewing all 14821 articles
Browse latest View live