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

[杭州][阿里巴巴][资深前端开发(P6/P7)]可能是阿里技术氛围最好的前端团队!!

$
0
0

[杭州][阿里巴巴][资深前端开发(P6/P7)]可能是阿里技术氛围最好的前端团队!!

职 位: 阿里巴巴安全部 前端工程师 ( P6:1-3 年经验 /P7:5 年以上经验)

工作职责: 根据设计人员制作的效果图,完成网站前端代码的开发(HTML、CSS、JS); 根据具体业务场景设计并实现前端基础架构; 参与开发各类开源库和工具; 数据可视化业务开发;

职位要求: 熟练掌握 html5,css3,javascript 等前端技术; 熟悉 jQuery,react,angularjs,bootstrap 等常用前段框架; 理解最新 Web 标准,理解 ES6/ES7,熟练掌握 gulp, npm, webpack 等各类开发工具; 热爱技术,具备良好的职业素养和团队协作精神;

加分项: 熟悉任何一门后端语言经验 (JAVA/C++/C#/Python/PHP); 有数据可视化方面开发经验; 自己的独立高质量开源项目; 对 UI/UX 有深入的理解;

感兴趣的小伙伴们请发送简历至 daiqing.daiqing@alibaba-inc.com


请教类似parseInt('Oxa') = 10怎么求逆运算?进制转换和unicode有点晕!

$
0
0

来源: 将一串字母和数字的字符串转成纯字母型的十六进制串: const encrpytStr=‘1j3kds98sd’; let res=’’; for (var i = 0; i < encrpytStr.length; i++) {

  res += String.fromCharCode(parseInt('0x' + encrpytStr[i]) + 97);转成纯字母

}

问题: 已知res十六进制串,如题目parseInt(‘Ox’+?) = B,已知B的数值,怎么求?的原始值? 这个 有点绕晕了,请教大家有啥好办法解答下?

log4js 在Windows下可以生成日志文件,Linux下不能

$
0
0

问题已解决!! pm2 启动文件的时候加上 ./文件名就行了,我了个去

以下是log4js的配置,大佬们帮我看看有问题吗,我windows可以生成log文件,linux需要注意什么

    replaceConsole: true,
    appenders: {
        out: { // 控制台输出
            type: 'stdout'
        },
        req: { // 请求日志
            type: 'dateFile',
            filename: path.join(config.log_dir, 'reqLog/req_'),
            pattern: 'yyyy-MM-dd.log',
            absolute: true,
            alwaysIncludePattern: true,
            encoding: 'utf-8',
        },
        err: { // 错误日志
            type: 'dateFile',
            filename: path.join(config.log_dir, 'errLog/err_'),
            pattern: 'yyyy-MM-dd.log',
            absolute: true,
            alwaysIncludePattern: true,
            encoding: 'utf-8',
        },
        oth: { // 其他日志
            type: 'dateFile',
            filename: path.join(config.log_dir, 'othLog/oth_'),
            pattern: 'yyyy-MM-dd.log',
            absolute: true,
            alwaysIncludePattern: true,
            encoding: 'utf-8',
        },
    },
    categories: {
        default: {
            appenders: ['out', 'req'],
            level: config.debug && env !== 'test' ? 'DEBUG' : 'ERROR',
        },
        err: {appenders: ['out', 'err'], level: 'error'},
        oth: {appenders: ['out', 'oth'], level: 'info'},
    },
});```

flv.js 如何做直播功能

$
0
0

是这样,现在已经有rtmp地址了,就想问下怎么放到flv上进行使用? untitled1.png直接放在flv官方demo上不行

关于Node的RSS

$
0
0

1.png为什么常驻内存会这么大?执行任务峰值能达到1.8G,但是heapTotal蛮稳定,回收后稳定400M。有没有人详细解释下这个常驻内存具体代表什么?还是跟系统内存有关系(系统内存闲置比较大)? 2.png

分享一个顺手的自定义Error工具库给大家: node-define-error

$
0
0

定义自己的异常类型可以方便开发调试工作. 关于为什么需要定制错误(或者说"异常")类型, 已经有很多文章说过了, 这里不再赘述.

我最近重新实现了(又)一个帮助定义异常类型的工具库: https://github.com/luochen1990/node-define-error

这个库基于v8提供的 Error.captureStackTrace这个API实现,目前没有做shim,所以如果用在浏览器上会存在兼容性问题, 这个shim后续版本应该会加上.

这个库相比于其它Custom Error库的区别在于支持嵌套异常 (嵌套在内部的异常会放在当前异常的 cause 属性上), 并且针对嵌套异常处理了一下报错信息的打印格式, 使得对于开发调试更加友好.

一个嵌套异常的例子:

image.png

希望这个小工具对大家有帮助 :)

mysql数据导出问题

$
0
0

用nodejs实现 总共有12个table,每次导出需要把12张表里的部分内容全部导出,导出的数据总共加起来最多几万行左右(应该不超过5W) 要求把导出的结果放在excel或者.csv文件里,看了下.csv好像不支持多个标签 如果放在excel里的话可以用一个文件+12标签搞定(分12个文件也没问题),.csv的话应该只能分12个文件了,不过也可以

现在主要的问题是如何导出: 1.用户点击了导出按钮,12张表依次select然后保存到excel,然后再下载(或者全部导出写到一个文件里最后下载,或者12个文件打成zip再下载) 2.好像有一个SELECT INTO OUTFILE的语句,这样的话就是分别导出为12个文件最后下载

不知道各位大佬有没有做过类似的功能,上面2种方式哪个效率高,还有别的实现方案吗?

分享我个人学习项目:移动webapp。

$
0
0

基于的技术栈: react,react-route 4,mobx

效果如图 image.png

主要学习整个react生态,webpack构建

项目地址: geekjc-antd-mobile

持续学习,后续加上node命令行学习。


请问node环境中,让setTimeout()准确的执行,没有延时,有哪些解决方案

favicon.ico 到底是什么来的呀 后端打印url一直有这个东西,前端显示请求失败的

$
0
0

1517583993(1).jpg这个到底是什么东西来的呀

深入理解React源码 VII - 英文预览版

$
0
0

Last time we discussed the core Transaction class and ReactDefaultBatchingStrategyTransaction. The instantiation is not the sole Transaction involved in UI updating but merely the one that leads.

In this post, we are going to examine the other Transactions which, together with ReactDefaultBatchingStrategyTransaction, outline the UI updating processing logic.

http://holmeshe.me/understanding-react-js-source-code-initial-rendering-VII/

有学习阿里eggjs框架的吗?给大家分享一个eggjs开发者社区。

$
0
0

社区地址使用过程中遇到问题可以在本社区提问。 目前社区还在不断完善中。 QQ截图20180203125053.png

使用node作为模板渲染中间层,使用Koa2或者Eggjs的时候应该是如何实现这个需求(内详)?

$
0
0

大家 本人是node小白 目前工作岗位需要实操eggjs
本人的知识背景停留在:

  • 了解http知识
  • npm init初始化项目 、npm管理依赖
  • 撸过一遍廖雪峰老师的koa教程 可以脱离教程实现一个koa应用根据不同请求实现不同响应 了解中间件的工作顺序以及使用mvc方式组织koa应用。
  • 撸过一遍eggjs的快速上手

假设有个新闻专题页 由上面的的轮播banner和下面的新闻标题列表组成。 banner和新闻标题都是java后台通过接口给的json数据。

1、使用node作为静态页面渲染中间层来输出这个页面的话,搜索引擎是可以抓取到新闻标题的吧? 2、koa2或者eggjs中 具体如何将模板和数据整合到一起? 如果按照以前前后端分离的思维写ajax请求 我是否也是需要在tpl模板文件里用js写响应的ajax请求?这样在中间件执行ctx.render()的时候也是可以得到渲染后的页面?

真诚求指点

express 中使用redis的套路

jsdoc 问题

$
0
0

function Product(obj) { /** * @property {String} shopName * @property {String} shopID * @property {String} productID * @property {String} productName * @property {Number} price * @property {URL} imageUrl */

}

这么写符合语法吗 我要预置一些属性

/**

  • @type {Db}
  • @property {Collection.<any>} user */ var db = mongo.db(""); 标记db有user 这个属性 及其类型

这么写没问题???

vscode 不能识别


不一样的跨域问题

$
0
0

项目是 vue+axios axios配置了代理 %1U%NO8X@BA3L%~[YP{A%]P.png

可以实现跨越了,但是问题马上就来了

如果请求的地址,返回的协议头带有location 就会进行重定向 获取数据。。那么久又不夸域了,,, 1UK0H5XPFCPB%@JI$Z37{1W.png

234.png

除了自己在写后台 进行封装处理 之外,,前端还有什么方法,,,,求赐教

小白问题:别人快速新建项目的app.js和我的很大差别

$
0
0

我是通过express ****来快速新建一个项目,然后新疆的项目文件里面进行npm install 根目录: 捕获3.PNG得到的app.js: 捕获.PNG然而别人的案例项目的app是 捕获2.PNG都是可以运行,那么我新建的项目中端口号设置以及路由设置在哪的呢?

Node API经验与种子项目分享 (二)功能详解

$
0
0

前言

基于本人在现在公司的Node微服务实践, 不断维护升级着一个Node Restful API种子项目, 特此共享出来以供借鉴和讨论. 项目中几乎所有的东西都使用了node/javascript及相应模块的最新功能, 语法, 和实践.

上一篇帖子, 本次分享将会对此项目提供的各个主要功能不分先后做下详细介绍. 项目github仓库地址, 欢迎star: https://github.com/xiaozhongliu/node-api-seed

详解

项目目录结构

    .vscode          VSC服务调试/测试调试配置  
    config           多环境服务配置, 不依赖外部逻辑  
    ctrl             控制器, 基本与路由对应  
    log              服务请求日志, 自动生成  
    midware          express服务中间件  
    model            数据库模型: mongo, postgres/mysql  
    service          服务层, 供控制器/中间件调用  
    test             API测试, 运行命令npm t  
    util             各种工具库, 仅依赖系统配置  
    .eslintrc.js     eslint规则配置  
    app.js           应用服务入口文件  
    global-helper.js 挂载少许全局helper  
    message.js       集中管理接口/系统消息  
    package.json     应用服务包配置文件  
    pm2.config.js    多环境pm2配置文件  
    router.js        集中管理服务路由  

项目首次运行

首次运行项目进行测试, 先脚本建表或执行User.sync()将表结构同步到数据库. 服务运行起来之后, 直接使用postman来实验提供的接口:
Run in Postman

路由注册扩展

代码文件: router.js自动判断有没有控制器对应的接口数据校验规则集合, 如有则采用. 包装控制器来统一捕捉抛出的非预期错误, 并将在app.js中最后一个中间件发送告警邮件. 提供基础健康检查接口.

接口数据校验

代码文件: midware/validate.js& util/validator.js按约定声明与控制器名称相同的接口数据校验规则集合, 即可在请求时进行验证. 例如:

/**
* validate api: login
*/
login: [
    // 参数名     参数类型     是否必传
    ['sysType', Type.Number, true],
    ['username', Type.String, true],
    ['password', Type.String, true],
],

类型校验方法大多是express-validator模块提供的, 可以自定义类型及其校验方法. 例如:

isHash(value) {
    return /^[a-f0-9]{32}$/i.test(value)
},

isUnixStamp(value) {
    return /^[0-9]{10}$/.test(value)
},

无效请求过滤

代码文件: midware/auth.js此中间件做的无效请求过滤, 和认证没关系. 具体通过header中传来的ts和token校验请求有效性. ts或token未传则会直接回绝请求, 这个可以过滤掉95%以上的无效请求了. ts和token对校验失败回绝请求, 不会执行后续业务逻辑. ts和token的计算规则参考中间件代码, 客户端要以相同的规则计算后传入, 参考postman中Pre-request Script:

const ts = new Date().getTime();
const TOKEN = "08fbf466b37a924a8b3d3b2e6d190ef3";

postman.setGlobalVariable("ts", ts);
postman.setGlobalVariable("token", CryptoJS.MD5(TOKEN+ts));

结果处理扩展

代码文件: util/extender.js给express的response添加扩展方法, 简化使用. 例如:

// 无需返回数据
res.success()

// 需要返回数据
res.success(payload)

res.success({
    accessToken,
    sysType: getRes.sysType,
    username: getRes.username,
    avatar: getRes.avatar,
    redirectUrl,
})

接口请求日志

代码文件: midware/httplog.js记录请求地址, 请求数据, 响应数据, 响应状态码及处理时长. 例如:

2018-02-02 13:23:46 - [B1qkId-Lf] Start  POST /login
2018-02-02 13:23:46 - [B1qkId-Lf] Data   {"sysType":1,"username":"unittest","password":"e10adc3949ba59abbe56e057f20f883e"}
2018-02-02 13:23:46 - [B1qkId-Lf] Resp   {"code":1,"msg":"success","data":{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVuaXR0ZXN0IiwiaWF0IjoxNTE3NTQ5MDI2LCJleHAiOjE1MTg0MTMwMjZ9.-U4P6ksOUN6WsmI3ZEWow9npYDmO-QI020eVY5Mg2bQ","sysType":1,"username":"unittest","avatar":"https://nodejs.org/static/images/logo.svg"}}
2018-02-02 13:23:46 - [B1qkId-Lf] Done   200 (134ms)

2018-02-02 13:23:49 - [SJCJUuZLM] Start  GET /verify
2018-02-02 13:23:49 - [SJCJUuZLM] Resp   {"code":1,"msg":"success","data":{"username":"unittest"}}
2018-02-02 13:23:49 - [SJCJUuZLM] Done   200 (7ms)

高并发时可通过请求ID来找到同一次请求的多行日志记录. 通过给原生res.json方法增加一个切面来实现非侵入记录响应数据:

// add a logging aspect to the primary res.json function
const origin = express.response.json
express.response.json = function (json) {
    logger.info(`[${this.reqId}] Resp  `, JSON.stringify(json))
    return origin.call(this, json)
}

支持日志在线预览, 可在浏览器查看日志文件内容(首次会有http auth认证):

当然如果使用的ELK(或者Elastic Stack), 则对于一次请求最好就输出一行json, 以方便logstash或者filebeat抓取.

服务监控面板

代码文件: midware/monitor.js可以打开这个地址查看服务监控面板(首次会有http auth认证): /dashboard

Jest接口测试

代码文件: test/base.test.js已经集成VSC Jest测试配置, 选择Jest All这个profile, 加断点并F5即可开始调试. 或者对当前打开的文件选择Jest File这个profile. 我开始用Jest的时候它才8000多star, 和ava差不多并列第三, 但现在已经排第一了, 不得不服自己的眼光, 啊哈哈哈哈…嗝. 样例:

describe('base ctrl tests', () => {

    test('login succeeds    ', async () => {
        const data = {
            sysType: 1,
            username: 'unittest',
            password: 'e10adc3949ba59abbe56e057f20f883e'
        }

        const res = await client.POST(`${host}/login`, data)
        expect(res.code).toBe(1)
        expect(res.data.username).toBe('unittest')
    })

    test('login fails       ', async () => {
        const data = {
            sysType: 1,
            username: 'unittest',
            password: 'invalid password'
        }

        const res = await client.POST(`${host}/login`, data)
        expect(res.code).toBe(message.LoginFail.code)
    })
})

执行npm t, 测试结果如下:

接口示例说明

提供了3个基于jsonwebtoken (jwt) 的接口示例: 注册, 登录, 验证. 验证接口仅供参考, 实际使用时应在中间件中验证jwt, 这样的中间件类似:

module.exports = async (req, res, next) => {
    if (
        ![
            '/path/needs/jwt/verification' // TODO: 考虑放到配置
        ].includes(req.path)
    ) {
        return next()
    }


    // // test generating a jwt token
    // const jwtToken = await jwtSvc.sign({
    //     foo: 'bar'
    // })
    // console.log(jwtToken)


    // verify
    const { authorization } = req.headers
    if (!authorization) {
        return next(new Error('verify fail')) // TODO: 修改错误处理, 下同
    }
    const jwtToken = authorization.substr(7)

    let payload
    try {
        payload = await jwtSvc.verify(jwtToken)
    } catch (e) {
        return next(new Error('verify fail'))
    }
    if (!payload) {
        return next(new Error('verify fail'))
    }


    console.log(payload) // TODO: 设置到req上, 后续就能拿到


    next()
}

thunk函数包装

代码文件: service/*.js node进化到今天, 用原生async/await做代码异步流程控制也已经好久了. 很多库提供了基于promise的API, 但难免还有很多基于thunk的库, 或者同时提供了promise的API但还不完善的库. 对于thunk函数我们可以使用node提供的util.promisify来包装为promise. 例如:

/**
    * set value of a hash field
    * @param {string} key      hash key
    * @param {string} field    field name
    * @param {string} value    field value
    */
    async hset(key, field, value) {
        if (typeof value === 'object') {
            value = JSON.stringify(value)
        }
        return promisify(redis.hset)(key, field, value)
    },

   /**
    * get value of a hash field
    * @param {string} key      hash key
    * @param {string} field    field name
    */
    async hget(key, field) {
        const value = await promisify(redis.hget)(key, field)
        try {
            return JSON.parse(value)
        } catch (e) {
            return value
        }
    },

Sequelize 定义实体的时候,列的默认值如何处理

$
0
0

所有的实体表,都存在几个相同的字段, 创建人,创建人名称,修改人,修改人名称,创建时间,修改时间,版本号

在定义model的时候,大致代码如下

app.model.define(name, attrs, {
            tableName: name,
			
            hooks: {
                beforeValidate: function (obj) {
                    let now = Date.now();
                    if (obj.isNewRecord) {
                        obj.version = 0;
                    } else {
                        obj.version++;
                    }
                }
            }
        });
		```
		
		在验证中无法获取到 ` app或者ctx对象  ` ,用户信息通过jwt保存在 ctx.state.user 中。
		
		请问怎么合适的去获取相关值。

两个爬虫问题请教- 图片直接转存问题, 下拉刷新下一页的获取问题

$
0
0

爬虫问题

  1. 墙外的图片能不能直接根据 url 地址转为 base64的图片存在数据库中? 不是整个列表的图片,是单个文章的图片,所以压力不会太大,而且只是实验性质
  2. 下拉刷新的网站,抓取第二页的时候,如何操作呢?
Viewing all 14821 articles
Browse latest View live