国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Webstorm開發(fā)Node.js應用代碼自動補全最佳實踐

2019-11-08 03:02:43
字體:
來源:轉載
供稿:網友

前言

利用Webstorm開發(fā)Node.js應用,最煩惱的就是代碼自動補全問題了。由于javaScript的弱類型特性,Webstorm等IDE在智能代碼補全功能上心有余而力不足,由Java、C++等轉過來的程序員會很不適應。這里介紹Webstorm支持的代碼自動補全功能,能夠一定程度緩解問題。

首先,看Webstorm的官方文檔:

https://www.jetbrains.com/help/webstorm/2016.3/creating-jsdoc-comments.html

里面講了Webstorm支持大部分的Google Closure Compiler的注解,并且能夠根據這些注解進行智能代碼補全。

這是Google Closure Compiler支持的注解,基本上是jsdoc規(guī)范的子集

https://github.com/google/closure-compiler/wiki/Annotating-Javascript-for-the-Closure-Compile

這是Google Closure Compiler類型及類型表達式規(guī)范

https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System

這里列舉一個代表的代碼段幾個常用的:

1自定義對象結構

/* ******************************************* * Copyright (c) 2016-2017 * XXXXXXXX Co.,Ltd. All rights reserved. * PRoject      : Task * File         : UserDao.js * Created      : 2017-02-08 * Author       : liangjiang * *******************************************/const crypto = require('crypto');const mongodb = require('./mongodb/mongodb');const User = require('../entity/User');const RandomUtil = require('../util/RandomUtil');const CODE = require('../../const/code');const logger = require('pomelo-logger').getLogger('debug-level', __filename, process.pid);const Collection = require('mongodb').Collection;/** * Class to Operate user. */class UserDao {    /** @typedef {{username:string, passWord:string}} UserData */    /**     * Create a new account.     *     * @param {UserData} opt     * @return {Promise<?User>}     */    static createNewAccount(opt) {        return new Promise(function (resolve, reject) {            let user;            /** @type {Collection} */            let tempCollection;            mongodb.collection('users')                .then((/** Collection */collection) => {                    tempCollection = collection;                    return collection.findOne({username: opt.username});                })                .then((doc) => {                    if (doc == null) {                        let userData = {                            username: opt.username || '',                            password: UserDao._saltAndHash(opt.password || '')                        };                        user = new User(userData);                        return tempCollection.insertOne(user.toObject(), {safe: true});                    } else {                        resolve(null);                    }                })                .then((result) => {                    user.setId(result.insertedId);                    resolve(user);                })                .catch((err) => {                    logger.error(err);                    reject(err);                });        });    }    /**     * Auto login.     *     * @param {UserData} opt     * @return {Promise<?User>}     */     static autoLogin(opt) {        return new Promise(function (resolve, reject) {            mongodb.collection('users')                .then((/** Collection */collection) => {                    return collection.findOne({username: opt.username});                })                .then((doc) => {                    if (doc == null) {                        resolve(null);                    }                    if (doc.password == opt.password) {                        resolve(new User(doc));                    }                    resolve(null);                })                .catch(function (err) {                    logger.error(err);                    reject(err);                });        });    }    /**     * Manual login.     *     * @param {UserData} opt     * @return {Promise<User|number>}     */    static manualLogin(opt) {        return new Promise(function (resolve, reject) {            mongodb.collection('users')                .then((/** Collection */collection) => {                    return collection.findOne({username: opt.username});                })                .then((doc) => {                    if (doc == null) {                        resolve(CODE.AUTH.LOGIN.FA_USER_NOT_EXIST);                    }                    if (UserDao._validatePassword(opt.password, doc.password)) {                        resolve(new User(doc));                    } else {                        resolve(CODE.AUTH.LOGIN.FA_PASSWORD_INVALID);                    }                })                .catch((err) => {                    logger.error(err);                    reject(err);                });        });    };    /**     * Validate password.     *     * @private     * @param {string} plainPass - Plain password.     * @param {string} hashedPass - Hashed password.     * @return {boolean} If equal.     */    static _validatePassword(plainPass, hashedPass) {        let salt = hashedPass.substr(0, 10);        let validHash = salt + UserDao._md5(plainPass + salt);        return hashedPass === validHash;    }    /**     * Salt and hash.     *     * @private     * @param {string} pass - Password to hash.     * @return {string} Hashed password.     */    static _saltAndHash(pass) {        let salt = UserDao._generateSalt();        return salt + UserDao._md5(pass + salt);    };    /**     * Generate a salt.     *     * @private     * @return {string} Random string of 10 characters.     */    static _generateSalt() {        return RandomUtil.randomString(10);    };    /**     * Calculate md5 value of a string.     *     * @private     * @param {string} str - String to md5.     * @return {string} Md5 value.     */    static _md5(str) {        return crypto.createHash('md5').update(str).digest('hex');    };}module.exports = UserDao;

利用@typedef注解可以定義對象結構,如下:

/** @typedef {{username:string, password:string}} UserData */

函數開頭的@private告訴Webstorm該方法是私有,Webstorm不會再外部調用時進行提示。

@param和@return可以定義函數的參數類型和返回值類型。

/** * Validate password. * * @private * @param {string} plainPass - Plain password. * @param {string} hashedPass - Hashed password. * @return {boolean} If equal. */如果是Promise類型,最好加上模板類型,既resolve(result)的中result的類型,這樣使用await時就不會提示有問題。

/** * Deal with the command: downloadList. * * @param {object} req * @return {Promise<Answer>} */async function doDownloadList(req) {    let /** Array<Download> */ downloads = await DownloadDao.getDownloads({targetId: req.session.target._id, status: 'unfinished'});    let data = [];    for (let download of downloads) {        data.push({id: download._id, saveName: download.filename});    }    return {answer: 'ok', data: data};}更詳細的用法還是看上面那兩個關于Google Closure Compiler的鏈接吧,都是照那上面學的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武冈市| 高陵县| 平昌县| 商河县| 云霄县| 武功县| 昔阳县| 化隆| 贵德县| 罗源县| 东辽县| 双江| 那坡县| 乌拉特后旗| 开鲁县| 镇远县| 南汇区| 遵义县| 永吉县| 临桂县| 佛教| 呼和浩特市| 涞水县| 内黄县| 天全县| 新民市| 望江县| 龙岩市| 依兰县| 依安县| 五峰| 察哈| 景泰县| 成安县| 北川| 新蔡县| 长兴县| 新龙县| 凤台县| 东阿县| 扶绥县|