服务器需要将上传收到的几张图片进行裁剪并合成,用了jimp这个库,print绘制文本,和write保存图片到本地比较耗时,这个过程中服务器完全无法响应其他请求。
请教各位前辈,一般这种情况怎么处理好?还是说node服务器本身就不适合用来处理图片?
服务器需要将上传收到的几张图片进行裁剪并合成,用了jimp这个库,print绘制文本,和write保存图片到本地比较耗时,这个过程中服务器完全无法响应其他请求。
请教各位前辈,一般这种情况怎么处理好?还是说node服务器本身就不适合用来处理图片?
http.requesthttp.get
我用第一种方法(http.request)没有任何响应,用第二种(http.get)就可以拿到数据。
node有 namespaces,cgroups 包没
From Noder
我们是英特吉姆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
我自己目前使用的验证方式是这样的: 客户登录的时候,登录验证通过,就把req.session中的一个属性设为true,比如req.session.authenticated=true 然后对于登录的判断,就是客户访问接口的时候,检查req.session.authenticated是否为true。 感觉这样不是很严谨,所以想问下这样做的弊端是什么,还有有什么更好点的方式来做验证。
跳转都是用a标签,只能进入页面才判断是否要登陆,没有v-router的钩子函数来拦截,求解决方案
A页面上 有 a1、a2、a3 按钮,绑定了事件 B页面上 有 b1、b2、b3 按钮,绑定了事件 C页面… D页面… …
问题: 绑定事件都写到一个 js 文件呢? 还是两个 js 文件,引用各自的 js 文件呢?
另外: 整个网站 css 都是写到一个 style.css文件 js 如果也这样: JQuery $ 查找 dom 节点,影响性能么?或者可以忽略不计? 代码不严谨时,报一些 not found 之类的 error
项目背景是这样的:我使用reactjs做了一个静态页面可以对parse后端进行CRUD操作,另外还有一个爬虫脚本可以通过命令行运行,但是我要部署到服务器上的时候,希望能跟通过这个静态页面调用这个爬虫脚本,因为我对reactjs和node都不是很熟练,所以只想到在express里面调用这个脚本,不知道还有没有更好的办法?因为我是打算部署项目到heroku上面,所以不能再启动一个进程了,各位大佬有什么好办法吗?
查了半天,基本都说是要改mysql的charset为utf8或者给createConnection加一个charset: ‘UTF8_GENERAL_CI’,然而… 执行 结果 但是!执行 结果! 可是啊! 而且!
好吧,实在是不知道还有什么地方有编码设置了…文本编辑器? 好了!还有谁!!!???
主站点为 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 从0一步步的开发出一个跨平台的CNode客户端,以此来提高自己对React Native 的理解。因为之前已经写了一次这个客户端,所以第二次希望能深入的了解和学习RN,并且提升自己的代码质量
总共录了18集,课程主要针对 nodejs 初学者,查看下面网址:
https://www.rails365.net/playlists/qing-song-xue-nodejs-ji-chu-pian
录制视频不易,如果对你有帮助,请多多支持。
下一套课程计划:Nodejs + express
我最近在自学nodejs
自己写了一个前端页面通过ajax请求服务器,服务器收到信息后存到mysql 并把收到的信息打印出来
我发现有一个没有规律出现的问题,就是运行的好好的 忽然前端页面提交的信息后服务器没反应了,也不打印出来,但是按了ctrl+c后
又立马运行并打印出来收到的信息,,,求大神指教为什么啊
我是不是描述的有点混乱。。
将前端的所有请求转发到其他网站,并将 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));
});
req.pipe(p)
那一行注释掉,但是却不明白为什么,很难受 详见:https://github.com/request/request/issues/1664req.pipe(p)
会一直 pending,取消注释以后会报 too many parametersform: _.clone(req.body),
注释掉以后,居然会提示 user not login
这个不算 bug 吧,只是感觉奇怪如何改进这个方法才能完全解决上面所说的问题
不好意思再次麻烦各位大佬,但是实在没辙了 心乱如麻,表达估计不太准确,有兴趣的大佬可以来拍
比如,做一个好友功能,添加好友,好友列表,就是随便点个人,可以看到他有多少好友关注等,这个是用到查数据库里面的好友列表,请问设计这个好友列表,怎么设计比较好
来自酷炫的 CNodeMD
一般而言,自动化测试涉及以下几个方面: 1、自由设定API测试顺序; 2、API之间存在数据关联,比如后面接口的请求参数会绑定前面接口的返回结果等; 3、支持对返回结果进行校验; 4、支持对数据进行处理,比如在测试登录接口时对密码进行加密等; 5、支持高级的代码用例,可以用代码来实现控制测试流程的目的,一般语言有js; eoLinker支持上述提到的所有功能,并且是目前全球唯一一款支持UI界面创建自动化测试的产品,用于自动化测试非常方便,并且用户体验相比于Postman等工具要好许多。 本篇主要记录eoLinker自动化测试中的简易模式(UI)。
eoLinker是目前国内最大的在线API管理平台,使用自动化测试需要拥有eoLinker账号,免费注册使用:官网除此之外还需要安装eoLinker官方提供的API测试增强插件,这个插件用于进行跨域测试以及自动化测试,官方提供了Chrome以及Firefox两个版本。 注册登陆之后,创建一个API项目,录入API文档,然后切换到自动化测试功能即可进行测试。
单例是自动化测试下面的一个基本单位,通俗地讲,单例也就是“单个API的测试条件和结果”。比如有一个用户登录接口,传递abc和123作为请求参数,然后返回”OK”作为成功的结果。 用例则是多个单例的合集,一个用例可以包含1~无限个的单例,并且把这些单例按顺序组合起来。比如测试完整的用户登录流程(注册-登录-判断登录状态-退出登录)。
和Postman一样,eoLinker也提供了环境变量的功能,帮助用户快速对测试API的环境进行切换,而不需要对API进行修改(比如开发和生产环境的参数和地址可能不同)。 不同的是,eoLinker的环境变量功能要更加强大,除了设置全局变量,eoLinker里面可以设定所有API的地址前缀、请求头部等信息。 在环境管理中创建好环境,在自动化测试的时候就可以根据不同的环境随时切换,非常方便。
如果你已经在接口管理中把API信息录入完毕,那么在创建单例的时候可以直接将接口文档导入,节约绝大多数的时间。或者我们也可以手动去录入单例的信息。 其中包括: 1、单例名称 2、API URL 3、请求参数 4、返回结果的判断条件 由于本篇文章介绍的是简易模式的自动化测试,以上的所有操作都将在UI界面中完成,不需要编写任何代码,操作上要简单许多。高级模式(代码)相关文章请点击这里
回顾刚才提到的用户登录流程(注册-登录-判断登录状态-退出登录),在这里我们发现除了第一个注册API之外,其余的API的请求参数或多或少会使用到前一个或几个API的返回值。比如登录的用户名密码是注册的用户名密码,判断登录状态需要知道登陆之后的token等。 eoLinker的自动化测试也提供了这样的功能,可以用图形化的界面非常方便地设置API之间的数据关联。我们在填写单例的请求参数信息时,右侧会出现“关联”的按钮,点击之后就可以选择该请求参数需要关联哪一个API的返回结果。
编辑完所有的单例之后,就进入到最后的测试阶段。eoLinker可以对单例单独做测试,也可以进行批量的用例测试。 在用例中点击测试按钮就会把所有的API测试一遍,然后遇到报错还会提供相关的反馈信息,比如和预设的结果对比。
1.创建注册单例 2.设定请求参数和返回结果的判断条件 3.类比创建后续的API单例,但是可以为请求参数加上关联条件(下图中token绑定了上一个登录接口的返回token值) 4.测试并检查返回结果 5.测试完毕,整个过程不超过10分钟,并且以后每当项目更新之后都可以跑一遍所有的自动化测试,极大的节省了开发测试的时间。
eoLinker还提供了导入Postman数据的功能,从今以后可以考虑抛弃Postman了。
eoLinker是一个针对开发人员需求而设计、免费而且开源的API接口管理平台,提供自动生成API文档、API自动化测试、Mock测试、权限管理、团队协作等功能,旨在解决由于前后端分离导致的开发效率低下问题,吸收了Postman以及RAP等接口管理产品的优点,提倡远程办公和敏捷开发,让开发者进行接口管理更加简单。
vue
的electron
环境,更多配置请访问源项目npm i -g vue-cli
vue init simulatedgreg/electron-vue my-project
cd my-project
npm i
npm run dev
electron
主进程与渲染进程的通信定义常量作为
channel
,也就是事件类型名称
const CLIENT_NORMAL_MSG = 'CLIENT_NORMAL_MSG' // 渲染进程发出消息类型
const CRAWLER_NORMAL_MSG = 'CRAWLER_NORMAL_MSG' // 主进程发出消息类型
在渲染进程中,使用vue plugin
的形式,具体参见vue
官方文档插件
ipcRenderer
是eventEmitter的一个实例,在渲染进程中使用,你可以通过它来像主进程发送同步和异步消息,也可以通过它来接收来自主进程的消息
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
实例化,其中需要使用的listener
为ipcMain
,ipcMain
和ipcRenderer
不同,它只负责对消息的监听,不复杂发送消息,这里需要入口文件中的mainWindow
下的webContents
作为消息的发送者,所以需要在mainWindow
创建成功之后再进行Ipc
的实例化
// ...
function createWindow() {
mainWindow = new BrowserWindow({
// ...
});
new IpcMgr(ipcMain, mainWindow.webContents)
}
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-request
和request-back
,start-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
向渲染进程发送消息,渲染页面,操作样式调整,页面看起来大概是这样。
在该项目中如果直接使用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~~~
使用nodejs + mongodb 快速构建项目,前端使用基于bootstrap风格的ui,可用于各种场景的web风格。 传送点安装部署 nodeJs(v8.0以上) 、mongodb(3.4)、
Node.js[必须]
`MongoDB[必须]``node@6.9.1 pm2@2.9.1 pm2 start -i 4 test.js 这种模式下,写文件,会出现数据丢失的情况,不知道各位大神有没有遇到过?里面有啥坑吗,github里有issues也翻过,并没有解决,求解救